通过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/:providerpath进行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') %>