OmniAuth - 当前会话未在OpenID回调中加载

时间:2011-02-19 09:31:36

标签: ruby-on-rails-3 omniauth

我正在使用OmniAuth和Rails 3.1.4,我试图允许已经过身份验证的用户将多个OpenID提供商与他们的帐户相关联。

作为未经身份验证的用户,使用OpenID登录即可。作为经过身份验证的用户,当我尝试使用其他oid提供程序登录时,执行回调方法时,它看起来就像我以前未经过身份验证。

对我而言,看起来控制器在会话初始化之前执行(或者会话被完全跳过)。

它可能是什么?

3 个答案:

答案 0 :(得分:13)

确认Andrei Serdeliuc的解决方案, 禁用protect_from_forgery为我工作(Ruby 1.8.7,Rails 2.3.11,OmniAuth 0.1.6)

你的CallbackController中的

(着名截屏视频中的AuthenticationsController) 在控制器工作的顶部添加 skip_before_filter :verify_authenticity_token protect_from_forgery :except => :create

因为它可能是CSRF(跨站点请求伪造)的一种方式,您应该验证openid服务器的身份,不要忘记设置证书验证(在初始化程序中):

# First of all get a ca-bundle.crt file (eg : from your open-source browser package)
require "openid/fetchers"
OpenID.fetcher.ca_file = "#{Rails.root}/config/ca-bundle.crt""

它会阻止警告:

WARNING: making https request to https://www.google.com/accounts/o8/id 
without verifying server certificate; no CA path was specified.

现在我的会话不再被重置,并且可以向我的curren_user添加几个openid身份验证。

欢呼声

答案 1 :(得分:2)

请记住,OmniAuth没有“登录”的概念。它只是验证用户是否在第三方应用程序中进行了身份验证,并为您提供了实施您自己的登录系统(或与existing one集成)所需的信息。 (有关此主题的优秀截屏视频;例如,请参阅Railscast上的part 1part 2。)

话虽如此,以下假设您没有陷入常见的陷阱,并且在回调中访问会话数据时遇到了问题。我的一些基本测试表明,会话在OmniAuth回调中按预期工作。请参阅https://github.com/BinaryMuse/so_5049994/compare/master...experiment上的以下代码:

class AuthController < ApplicationController
  def callback
    session[:count] ||= 0
    session[:count] += 1

    @count = session[:count]
    @env   = env['omniauth.auth']
  end
end

通过各种服务进行身份验证后,我有应用程序(其中包括Facebook和Twitter),我收到的输出类似于以下内容(请参阅the view file):

OmniAuth Callback

Number of times viewed (session): 5

OmniAuth Hash:

  {"provider"=>"facebook", "uid"=>"1017... (rest of omniauth hash here)

答案 2 :(得分:0)

至于我,我必须使用Intuit实现一个应用程序,并遇到了同样的问题。为我修复的不是删除保护伪造或跳过authenticity_token检查,而是确保我在本地提交授权表单的页面与重定向URL具有相同的主机。我有127.0.0.1:3000,但redirect_url是localhost:3000