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

时间:2014-03-26 11:51:09

标签: facebook redirect ruby-on-rails-3.2 open-uri

我有这个代码用于从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

但有两件事我不明白:

  1. 昨天工作得很好......我什么都没改变。那么,为什么Paperclip突然无法获得正确的URL?
  2. Open-Uri-redirections的说明给出了以下示例:

    打开(' http://github.com',:allow_redirections =>:安全)

  3. 我如何与上面的代码协调?

5 个答案:

答案 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.rbdevise.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","htt­ps")
=> "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)