facebook redirect ruby-on-rails-3.2 open-uri

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:

  1. Esto funcionó muy bien AYER ... y no he cambiado nada. Entonces, ¿por qué, de repente, Paperclip no puede obtener la URL correcta?
  2. 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","htt­ps") => "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.