Omniauth for facebook无法生成良好的URL

时间:2013-09-12 07:06:17

标签: ruby-on-rails facebook devise omniauth

对于facebook使用omniauth,我想将一些额外的参数传递给URL,以便在回调中处理它们。

我发现了很多关于此的文档(除了官方文档之外,例如:Devise + Omniauth - How to pass extra parameters along?)。但没有人为我工作。

使用:

omniauth_authorize_path(:user, :facebook, msg: 'Hello')

生成此网址:

/users/auth/facebook?locale=fr

知道为什么它不起作用?感谢。

更新

参数locale=fr是因为我已经要求应用程序始终在URL中使用locale。我的 application_controller.rb 使用以下方法:

class ApplicationController < ActionController::Base

    protect_from_forgery

    before_filter :set_locale

    def set_locale
        I18n.locale = params[:locale] || I18n.default_locale
    end

    # Always add :locale parameter to URL
    def url_options
        {:locale => I18n.locale}.merge(super)
    end

end

删除 url_options 方法无法解决问题,现在提供以下网址:

/users/auth/facebook

3 个答案:

答案 0 :(得分:2)

并非完全有很多帮助,但我只是在我自己的代码上尝试了这一点,它似乎运行良好:

omniauth_authorize_path(:user, :facebook, msg: "Hello")

产生

http://localhost:3000/users/auth/facebook?msg=Hello

我想要注意的一件有趣的事情是第一行也相当于:

user_omniauth_authorize_path(:facebook, msg: "Hello")

我可以问你正在使用哪种版本的宝石吗?

我能想到的唯一另一件事可能是你的url_options方法干扰了设计。尝试将set_locale方法更改为如下所示:

def set_locale
   I18n.locale = params[:locale] || I18n.default_locale
   self.default_url_options[:locale] = I18n.locale 
end

答案 1 :(得分:0)

你无法将任何随机命名的param传递给facebook auth并在回调时将其恢复,但解决问题的一种方法是使用param状态/users/auth/facebook?state=fr但要注意默认状态是用来防止CSRF(http://en.wikipedia.org/wiki/Cross-site_request_forgery)所以也许你可以用一些额外的数据来复制你的状态参数,以确保回调是你先前的请求中的回调

答案 2 :(得分:0)

刚刚解决了我自己的问题。结果是gem:https://github.com/kot-begemot/rails-localization

然而必须将它发布到RubyGems,但忘记了我的凭据=(