8

我正在将 OmniAuth 与 Rails 3.1.4 一起使用,并且我试图允许已经过身份验证的用户将多个 OpenID 提供者与其帐户相关联。

作为未经身份验证的用户,使用 OpenID 登录可以正常工作。作为经过身份验证的用户,当我尝试使用不同的 oid 提供程序登录时,执行回调方法时,看起来我之前没有经过身份验证。

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

会是什么呢?

4

3 回答 3

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 服务器的身份,不要忘记设置证书验证(在初始化程序中):

# 首先得到一个 ca-bundle.crt 文件(例如:从你的开源浏览器包中)
需要“openid/fetchers”
OpenID.fetcher.ca_file = "#{Rails.root}/config/ca-bundle.crt""

它将防止以下警告:

警告:向 https://www.google.com/accounts/o8/id 发出 https 请求
不验证服务器证书;没有指定 CA 路径。

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

干杯

于 2011-03-11T10:31:08.183 回答
2

请记住,OmniAuth 没有“登录”的概念。它只是验证用户在第三方应用程序中是否经过身份验证,并为您提供实现自己的登录系统(或与现有登录系统集成)所需的信息。(有关于这个主题的优秀截屏视频;例如,参见关于 Railscasts 的第 1 部分第 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)的各种服务进行身份验证后,我收到类似于以下的输出(请参阅视图文件):

OmniAuth Callback

Number of times viewed (session): 5

OmniAuth Hash:

  {"provider"=>"facebook", "uid"=>"1017... (rest of omniauth hash here)
于 2011-02-19T23:31:41.520 回答
0

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

于 2017-12-14T17:52:20.773 回答