通过OmniAuth传递参数

时间:2012-03-27 13:54:42

标签: ruby-on-rails omniauth

我需要将一些参数传递给回调动作。从源代码来看,OmniAuth应该将查询字符串添加到回调URL,但奇怪的是它没有。当我打开

/auth/facebook?from=partner

...并被重定向到Facebook,return_url只是

/auth/facebook/callback

...没有任何参数。

7 个答案:

答案 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') %>