我有这个代码用于从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
但有两件事我不明白:
Open-Uri-redirections的说明给出了以下示例:
打开(' http://github.com',:allow_redirections =>:安全)
我如何与上面的代码协调?
答案 0 :(得分:42)
我实际上认为最简单的处理方法是通过https
直接请求头像。要做到这一点,只需使用
https://graph.facebook.com/672086173/picture?type=square
而不是
http://graph.facebook.com/672086173/picture?type=square
如果您使用的是omniauth-facebook
,则需要在omniauth初始化程序中指定secure_image_url: true
来生成该网址。像这样:
config.omniauth :facebook, "XXXX", "XXXX",
image_size: { width: 500, height: 500 },
secure_image_url: true
您的omniauth初始化程序应位于config/initializers
目录中,如果您与设计一起使用,则可能称为omniauth.rb
或devise.rb
。
答案 1 :(得分:29)
如果您使用的是omniauth-facebook
,请按照deivid的回答。
解决此问题的另一种方法是将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'
并运行bundle install以安装gem
然后在你的模型中
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
现在使用类似
的方法处理头像网址if auth.info.image.present?
avatar_url = process_uri(auth.info.image)
user.update_attribute(:avatar, URI.parse(avatar_url))
end
希望这可以帮助其他可能遇到此问题的人。
答案 2 :(得分:5)
open_uri_redirections对我不起作用。我可以通过将原始的Facebook图像网址从http更改为https来实现。这样,重定向到https上的akamai CDN不是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))
答案 3 :(得分:1)
我遇到了同样的错误。昨天它正在运作。所以,我使用了以下没有gem的解决方案:
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']
我希望它可以帮到你。
答案 4 :(得分:0)
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)