Rails 3.2.17 Runtime Error Redirection Forbidden facebook
ruby-on-rails-3.2 open-uri (5)
Tengo este código que uso para obtener avatares de Facebook ...
if auth.info.image.present?
user.update_attribute(:avatar, URI.parse(auth.info.image))
end
Cuando intento cargar el código ahora, aparece este error:
A RuntimeError occurred in authentications#create:
redirection forbidden: http://graph.facebook.com/672086173/picture?type=square -> https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/t5.0-1/1086349_672086173_156380036_q.jpg
/home/ubuntu/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/open-uri.rb:223:in `open_loop''
Entiendo que este es un problema con Open-URI que no permite HTTP a las redirecciones HTTPS ... y entiendo que esto se puede resolver con el complemento Open-Uri-Redirections https://github.com/jaimeiniesta/open_uri_redirections
Pero hay dos cosas que no entiendo:
- Esto funcionó muy bien AYER ... y no he cambiado nada. Entonces, ¿por qué, de repente, Paperclip no puede obtener la URL correcta?
Las instrucciones para las redirecciones Open-Uri dan el siguiente ejemplo:
abrir ('' http://github.com '',: allow_redirections =>: seguro)
¿Cómo podría conciliar esto con mi código anterior?
open_uri_redirections no funcionaba para mí. Podría hacerlo funcionar cambiando la URL de la imagen de Facebook original a https desde http. De esa forma, la redirección al akamai CDN en https no es una redirección http -> https, sino una redirección https - https.
en tu ejemplo
user.update_attribute(:avatar, URI.parse(auth.info.image))
se convertiría
uri = URI.parse(auth.info.image)
uri.scheme = ''https''
user.update_attribute(:avatar, URI.parse(uri))
La solución de FWIW, @ deep no me funcionaba del todo, aunque me acercó mucho más.
Terminé haciendo esto:
private
def process_uri(uri)
require ''open-uri''
require ''open_uri_redirections''
open(uri, :allow_redirections => :safe) do |r|
r.base_uri.to_s
end
end
Y entonces:
avatar_url = process_uri(auth[:info][:image])
new_user.update_attribute(:remote_avatar_url, avatar_url)
Actualizar
Si usa omniauth-facebook
, siga la respuesta de deivid.
Otra forma de resolver este problema es reemplazar http por https. De esa forma, se redireccionará de https a https y no obtendrá un error prohibido de redireccionamiento.
Ejemplo
> url = auth.info.image
=> "http://graph.facebook.com/672086173/picture?type=square"
> avatar_url =url.gsub("http","https")
=> "https://graph.facebook.com/672086173/picture?type=square"
Tuve exactamente el mismo problema. Lo resuelvo con los siguientes pasos
Primero en tu gemfile agrega
gem ''open_uri_redirections''
y ejecute bundle install para instalar la gema
Y luego en tu modelo
private
def process_uri(uri)
require ''open-uri''
require ''open_uri_redirections''
open(uri, :allow_redirections => :safe) do |r|
r.base_uri.to_s
end
end
Ahora procesa la url de avatar con el método como
if auth.info.image.present?
avatar_url = process_uri(auth.info.image)
user.update_attribute(:avatar, URI.parse(avatar_url))
end
Espero que esto ayude a cualquier otra persona que pueda estar teniendo este problema.
Yo estaba con el mismo error. Ayer estaba funcionando. Entonces, he usado la siguiente solución sin gema:
url = URI.parse(''<YOUR FACEBOOK URL>'')
h = Net::HTTP.new url.host, url.port
h.use_ssl = url.scheme == ''https''
head = h.start do |u|
u.head url.path
end
new_url = head[''location'']
Espero que pueda ayudarte.
De hecho, creo que la forma más limpia de manejar esto es solicitar directamente el avatar a través de https
. Para hacer eso, solo usa
https://graph.facebook.com/672086173/picture?type=square
en lugar de
http://graph.facebook.com/672086173/picture?type=square
Si está utilizando omniauth-facebook
, deberá especificar secure_image_url: true
en su inicializador omniauth para generar esa url. Al igual que:
config.omniauth :facebook, "XXXX", "XXXX",
image_size: { width: 500, height: 500 },
secure_image_url: true
Su inicializador de omniauth debe estar en su directorio config/initializers
, probablemente llamado omniauth.rb
o devise.rb
si lo está usando junto con idear.