Rails 3.2.17运行时错误重定向禁止的facebook

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

但有两件事我不明白:

  1. 昨天工作得很好......我什么都没改变.那么,为什么Paperclip突然无法获得正确的URL?
  2. 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如果您与设计一起使用它.

  • 你能详细说明一下这应该去哪里吗? (2认同)

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","htt­ps")
=> "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)

希望这有助于其他可能遇到此问题的人.

  • 这行应该是:user.update_attribute(:avatar,URI.parse(avatar_url))现在它可以工作.:) (3认同)

Jos*_*ews 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))
Run Code Online (Sandbox Code Playgroud)