我需要将一些参数传递给回调动作。从源代码来看,OmniAuth应该将查询字符串添加到回调URL,但奇怪的是它没有。当我打开
/auth/facebook?from=partner
...并被重定向到Facebook,return_url
只是
/auth/facebook/callback
...没有任何参数。
答案 0 :(得分:76)
在努力解决上述所有问题之后,我想出了如何处理关于 Facebook 的问题,默认情况下不会显示request.env["omniauth.auth"]
中的参数。
所以 - 如果你使用查询字符串作为回调,类似于这样:
"/auth/facebook?website_id=#{@website.id}"
获取该website_id参数的唯一方法是使用request.env["omniauth.params"]
。 注意:请确认你使用omniauth.params而不是omniauth.auth - 这个让我吵了一会儿。
然后,为了测试它,你可以在控制器动作中检查它(注意RAISE线......):
def create
raise request.env["omniauth.params"].to_yaml
# the rest of your create action code...
end
你应该在那里看到你的参数。大。现在,返回您的控制器并删除该RAISE线。然后,您可以在控制器操作中按如下方式访问参数:
params = request.env["omniauth.params"]
website_id = params["website_id"]
注意:在params [“website_id”]中,您需要使用引号而不是符号。
答案 1 :(得分:22)
我认为cookie的功能可行,但为什么在你可以使用这里记录的状态变量时做所有这些:https://github.com/mkdynamic/omniauth-facebook
这就是我使用它的方式:
创建url时,您只需在Query String中添加状态,它也可以在回调URL中使用。
user_omniauth_authorize_path(:facebook, :display => 'page', :state=>'123') %>
现在回调网址将是
http://localhost:3000/users/auth/facebook/callback?state=123&code=ReallyLongCode#_=_
现在在回调处理程序中,您可以处理状态
答案 2 :(得分:12)
您可以使用:params
选项,如
omniauth_authorize_path(:user, :facebook, var: 'value', var2: 'value2' )
以及稍后在回调中,您可以访问request.env['omniauth.params']
来获取哈希值! :)
(从this answer复制)
答案 3 :(得分:7)
您要做的是动态设置回调,以便在每个身份验证交易的基础上在网址中包含合作伙伴名称(不 url参数),具体取决于涉及哪个合作伙伴。这意味着为每个身份验证请求动态设置回调URL。见this blog post to get started。正如您所注意到的,回调网址会自动删除网址参数,因此使用参数执行此操作将无效。
因此,如果您没有尝试将合作伙伴名称/ ID作为参数(已删除)传递,那么您构建了路由,以便partner_id
和OmniAuth provider
成为回调的一部分url,然后你会有类似的东西:
/auth/:omniauth_provider/callback/:partner_id
...有效的回调类似于
/auth/facebook/callback/123456
...然后你会知道给定的回调来自facebook,合作伙伴ID为123456
答案 4 :(得分:6)
OmniAuth已经有了一种内置的方式来了解用户的位置,它被称为“起源”,如下所示:
https://github.com/intridea/omniauth/wiki/Saving-User-Location
答案 5 :(得分:1)
你知道,我想我可能会努力解决这个问题。
Cookie可能就是答案。我认为您可以通过让您的登录操作存储cookie,然后重定向到正确的/auth/:provider
路径进行身份验证来解决此问题,并且当触发回调时(在SessionsController#create
中),您只需阅读cookie回来知道将它们重定向到哪里。
所以,现在,您的“使用Facebook登录”链接(或您在应用中拥有的任何内容)可能会转到/auth/facebook
。相反,如果您创建了一个自定义操作,如
POST /partner_auth
...并用网址调用它......
POST example.com/partner_auth?from=partner&provider=facebook
然后你可能有一个像:
这样的控制器class PartnerAuth < ApplicationController
def create
cookies[:from] = params[:from] # creates a cookie storing the "from" value
redirect_to "auth/#{params[:provider]"
end
end
然后在SessionsController#create
行动中,你会......
def create
...
destination = cookies[:from]
cookies[:from].delete
redirect_to destination # or whatever the appropriate thing is for your
# app to do with the "from" information
end
我尝试构建一个演示应用程序来完成我在其他答案中概述的内容,但你是对的 - 尝试动态地将自定义回调注入到OmniAuth代码中太复杂了。有一个配置选项可以覆盖默认的回调,但似乎不容易动态设置它。
所以,我突然意识到,cookie会更简单,特定于用户,因为理论上你只需要在很短的时间内(在用户尝试进行身份验证之间)存储这个from
信息,当触发回调时),创建一个cookie并没有什么大不了的,然后在回调被击中时删除它。
答案 6 :(得分:-1)
使用'state'变量。 Facebook允许用户设置STATE变量。
我是这样做的,我在AUTH URL中添加了?state = providername
http://localhost/users/auth/facebook?state=providername
这个参数在Callback中以params ['providername']
的形式返回给我我设计了原始的Omniauth Path Method
的解决方案user_omniauth_authorize_path(:facebook, :display => 'page', :state=>'123') %>