Подтвердить что ты не робот

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

Но я не понимаю две вещи:

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

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

Как мне смириться с моим кодом выше?

4b9b3361

Ответ 1

Update

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

Еще один способ решить эту проблему - заменить 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

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

Ответ 2

На самом деле я считаю, что самый чистый способ обращения с этим напрямую запрашивает аватар через 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, если вы используете его вместе с приложением.

Ответ 3

open_uri_redirections не работал у меня. Я мог бы заставить его работать, изменив исходный код изображения 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))

Ответ 4

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

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

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

Ответ 5

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)