对于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
答案 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,但忘记了我的凭据=(