Rails 3.2.17 Запрещено перенаправление ошибок во время выполнения facebook

У меня есть этот код, который я использую для получения аватаров из Facebook...

if auth.info.image.present?
      user.update_attribute(:avatar, URI.parse(auth.info.image))
end

Когда я пытаюсь загрузить код сейчас, я получаю эту ошибку:

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'

Я понимаю, что это проблема с Open-URI, которая не разрешает перенаправления с HTTP на HTTPS... и я понимаю, что это можно решить с помощью плагина Open-Uri-Redirections https://github.com/jaimeiniesta/open_uri_redirections

Но есть две вещи, которые я не понимаю:

  1. Это работало просто отлично ВЧЕРА... и я ничего не изменил. Так почему же Paperclip вдруг не может получить правильный URL?
  2. В инструкциях по переадресации Open-Uri приведен следующий пример:

    open('http://github.com', :allow_redirections => :safe)

Как мне согласовать это с моим кодом выше?


person mystic cola    schedule 26.03.2014    source источник
comment
У меня такая же ошибка, вчера все работало хахаха   -  person Franzé Jr.    schedule 26.03.2014


Ответы (5)


Обновлять

Если вы используете omniauth-facebook, следуйте ответу deivid.

Другой способ решить эту проблему — заменить http на https. Таким образом, он будет перенаправлять с https на https, и вы не получите ошибку запрещенного перенаправления.

Пример

> 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"

У меня была точно такая же проблема. Я решаю это с помощью следующих шагов

Сначала в вашем gemfile добавьте

gem 'open_uri_redirections'

и запустите установку пакета, чтобы установить драгоценный камень

И тогда в вашей модели

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

Теперь обработайте URL-адрес аватара с помощью такого метода, как

if auth.info.image.present?
   avatar_url = process_uri(auth.info.image)
   user.update_attribute(:avatar, URI.parse(avatar_url))
end

Надеюсь, это поможет любому, у кого может возникнуть эта проблема.

person Monideep    schedule 26.03.2014
comment
Получение следующей ошибки: Произошла ошибка Paperclip::AdapterRegistry::NoHandlerError при аутентификации#create: обработчик не найден для fbcdn-profile-a.akamaihd.net/hprofile-ak-prn2/t5.0-1/ скрепка (3.4.2) lib/скрепка /io_adapters/registry.rb:19:in `handler_for' - person mystic cola; 26.03.2014
comment
Эта строка должна быть такой: user.update_attribute(:avatar, URI.parse(avatar_url)) ТЕПЕРЬ это работает. :) - person mystic cola; 26.03.2014
comment
Куда идет метод "обработать URL-адрес аватара"...? он должен идти в блоке создания? - person Peege151; 15.04.2014
comment
@mysticcola У меня есть аналогичный вопрос здесь - person Peege151; 15.04.2014
comment
По какой-то причине я продолжаю получать неопределенный метод NoMethodError для process_uri, хотя он явно присутствует в моей модели User.rb. Любые идеи ? - person Tom Maxwell; 01.08.2014

На самом деле я думаю, что самый простой способ справиться с этим — напрямую запросить аватар через https. Для этого просто используйте

https://graph.facebook.com/672086173/picture?type=square

вместо

http://graph.facebook.com/672086173/picture?type=square

Если вы используете omniauth-facebook, вам нужно будет указать secure_image_url: true в инициализаторе omniauth для создания этого URL-адреса. Вот так:

config.omniauth :facebook, "XXXX", "XXXX",
                           image_size: { width: 500, height: 500 },
                           secure_image_url: true

Ваш инициализатор omniauth должен находиться в вашем каталоге config/initializers, возможно, с именем omniauth.rb или devise.rb, если вы используете его вместе с devise.

person deivid    schedule 16.04.2014
comment
Действительно, самый чистый способ! Большое спасибо. - person Volmer; 14.05.2014
comment
Это должен быть принятый ответ, если все используют omniauth-facebook. Спасибо. - person Arnaud; 15.05.2014
comment
Согласитесь, это гораздо более чистый ответ, и он работает как шарм! Спасибо, что предложили настройку omniauth-facebook! - person timherby; 09.06.2014
comment
secure_image_url: true — это правильный путь. - person Puce; 12.06.2014
comment
Не могли бы вы подробнее, куда именно это должно идти? - person Augustin Riedinger; 26.09.2014
comment
Если бы кто-нибудь мог предоставить подробное описание того, куда должна идти эта конфигурация. - person user3702916; 01.10.2014
comment
Пример того, что должен содержать ваш config/initializers/devise.rb файл: config.omniauth :facebook, "XXXX", "XXXX", image_size: { width: 500, height: 500 }, secure_image_url: true - person flyingL123; 17.12.2015
comment
Спасибо @flyingL123, я добавил ваш совет к ответу. - person deivid; 18.12.2015

open_uri_redirections у меня не работал. Я мог бы заставить его работать, изменив исходный URL-адрес изображения facebook на https с http. Таким образом, перенаправление на CDN akamai на https является не перенаправлением http -> https, а перенаправлением https-https.

в вашем примере

user.update_attribute(:avatar, URI.parse(auth.info.image))

станет

uri = URI.parse(auth.info.image)
uri.scheme = 'https'
user.update_attribute(:avatar, URI.parse(uri))
person Josh Crews    schedule 28.03.2014

Я был с той же ошибкой. Вчера работало. Итак, я использовал следующее решение без драгоценного камня:

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']

Я надеюсь, что это может помочь вам.

person Franzé Jr.    schedule 26.03.2014

FWIW, решение @deep не совсем сработало для меня, хотя оно значительно приблизило меня.

В итоге я сделал это:

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

А потом:

avatar_url = process_uri(auth[:info][:image])
new_user.update_attribute(:remote_avatar_url, avatar_url)
person Mic Fok    schedule 08.04.2014
comment
Несколько человек упомянули, что ответ Дипа не сработал для них ... Я не могу понять, почему ... Какую ошибку вы получили? У меня это сработало идеально в первый раз... (ну... во ВТОРОЙ раз, после того, как я изменил его процесс uri) - person mystic cola; 08.04.2014