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)
Как мне смириться с моим кодом выше?
Ответы
Ответ 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","https")
=> "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)