通过OmniAuth传递参数
我需要传递一些参数给callback动作。 从源代码来看,OmniAuth应该将查询string添加到callbackURL中,但奇怪的是它没有。 当我打开
/auth/facebook?from=partner
…并redirect到Facebook, return_url
只是
/auth/facebook/callback
没有任何参数
经过以上所有的答案,我想出了怎么办Facebook的 ,默认情况下,不显示参数request.env["omniauth.auth"]
。
所以 – 如果你正在使用查询string的callback,类似于这样的事情:
"/auth/facebook?website_id=#{@website.id}"
获得该website_id参数的唯一方法是使用request.env["omniauth.params"]
。 注:确保你使用omniauth.params而不是omniauth.auth – 这一个绊了我一会儿 。
然后,为了testing这个,你可以在你的控制器动作中检查它(注意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"]
注意:在参数[“website_id”]你需要使用引号而不是一个符号。
我猜cookie的工作原理,但为什么所有这一切,当你可以使用状态variableslogging在这里: https : //github.com/mkdynamic/omniauth-facebook
这是我用它的方式:
当创buildurl时,你可以在查询string中添加状态,也可以在callbackurl中使用。
user_omniauth_authorize_path(:facebook, :display => 'page', :state=>'123') %>
现在的callbackurl将是
http://localhost:3000/users/auth/facebook/callback?state=123&code=ReallyLongCode#_=_
现在在callback处理程序中可以处理状态
你可以使用:params
选项,如
omniauth_authorize_path(:user, :facebook, var: 'value', var2: 'value2' )
稍后在callback中,您可以访问request.env['omniauth.params']
来获取哈希值! 🙂
(从这个答案复制)
你想要做的是dynamic地设置你的callback,在每个authentication交易的基础上,包括合伙人的名称在url中( 而不是 url参数),这取决于涉及哪个合作伙伴。 这意味着为每个authentication请求dynamic地设置callbackURL。 看到这个博客文章开始 。 正如你所注意到的那样,callbackurl会自动删除url参数,所以用参数做这件事情是行不通的。
所以,如果不是试图通过合作伙伴名称/ id作为参数(被删除),你的路由结构,以便partner_id
和OmniAuth provider
是callbackurl的一部分,那么你会有这样的:
/auth/:omniauth_provider/callback/:partner_id
…有效的callback将是类似的东西
/auth/facebook/callback/123456
…然后你会知道,一个给定的callback来自Facebook,与合作伙伴ID 123456
OmniAuth已经有一个内置的方法来知道用户在哪里,这就是所谓的“起源”,如下所述:
https://github.com/intridea/omniauth/wiki/Saving-User-Location
你知道,我想我可能会努力解决这个难题。
cookies可能是答案。 我认为你可以通过让你的login动作存储一个cookie,然后redirect到适当的/auth/:provider
path进行authentication来解决这个问题,并且当callback被触发时(在SessionsController#create
),你只需要读取cookie知道在哪里redirect他们。
所以,现在,您的“与facebooklogin”链接(或任何你在你的应用程序中)可能会去/auth/facebook
。 相反,如果你创build了一个自定义的动作
POST /partner_auth
…并用url调用它…
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
我试图构build一个演示应用程序来完成我在其他答案中概述的内容,但是您是对的 – 尝试将自定义callbackdynamic注入OmniAuth代码太复杂了。 有一个configuration选项可以覆盖默认的callback,但是看起来不容易dynamic设置。
所以,我想到cookie会更简单,用户特定,因为理论上你只需要在很短的时间内(在用户尝试authentication和callback被触发时) from
信息中存储这些信息,创build一个cookie并没有什么大不了的,然后在callback命中时删除它。
使用“状态”variables。 Facebook允许用户设置一个STATEvariables。
我是这样做的,我在?state = providername附加了AUTH URL
http://localhost/users/auth/facebook?state=providername
这个参数在callback函数中作为params ['providername']返回给我
我从原始的Omniauthpath方法devise出解决scheme
user_omniauth_authorize_path(:facebook, :display => 'page', :state=>'123') %>