通过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') %>