mys*_*ola 18 redirect facebook open-uri ruby-on-rails-3.2
我有这个代码用于从Facebook获取头像...
if auth.info.image.present?
user.update_attribute(:avatar, URI.parse(auth.info.image))
end
Run Code Online (Sandbox Code Playgroud)
当我尝试加载代码时,我收到此错误:
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'
Run Code Online (Sandbox Code Playgroud)
我知道这是Open-URI不允许HTTP到HTTPS重定向的问题...我明白这可以用Open-Uri-Redirections插件解决https://github.com/jaimeiniesta/open_uri_redirections
但有两件事我不明白:
Open-Uri-redirections的说明给出了以下示例:
打开(' http ://github.com',:allow_redirections =>:safe)
我如何将其与上面的代码进行协调?
dei*_*vid 42
我认为最简单的处理方式是直接请求化身https.要做到这一点,只需使用
https://graph.facebook.com/672086173/picture?type=square
Run Code Online (Sandbox Code Playgroud)
代替
http://graph.facebook.com/672086173/picture?type=square
Run Code Online (Sandbox Code Playgroud)
如果您正在使用omniauth-facebook,则需要secure_image_url: true在omniauth初始化程序中指定生成该URL.像这样:
config.omniauth :facebook, "XXXX", "XXXX",
image_size: { width: 500, height: 500 },
secure_image_url: true
Run Code Online (Sandbox Code Playgroud)
您的omniauth初始化程序应该在您的config/initializers目录中,可能已调用,omniauth.rb或者devise.rb如果您与设计一起使用它.
Mon*_*eep 29
如果您正在使用omniauth-facebook请按照deivid的回答.
解决此问题的另一种方法是用https替换http.这样它将从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"
Run Code Online (Sandbox Code Playgroud)
我有同样的问题.我通过以下步骤解决它
首先在你的gemfile中添加
gem 'open_uri_redirections'
Run Code Online (Sandbox Code Playgroud)
并运行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
Run Code Online (Sandbox Code Playgroud)
现在使用类似的方法处理头像网址
if auth.info.image.present?
avatar_url = process_uri(auth.info.image)
user.update_attribute(:avatar, URI.parse(avatar_url))
end
Run Code Online (Sandbox Code Playgroud)
希望这有助于其他可能遇到此问题的人.
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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7897 次 |
| 最近记录: |