我正在将 OmniAuth 与 Rails 3.1.4 一起使用,并且我试图允许已经过身份验证的用户将多个 OpenID 提供者与其帐户相关联。
作为未经身份验证的用户,使用 OpenID 登录可以正常工作。作为经过身份验证的用户,当我尝试使用不同的 oid 提供程序登录时,执行回调方法时,看起来我之前没有经过身份验证。
对我来说,它看起来就像控制器在会话初始化之前执行(或会话被完全跳过)。
会是什么呢?
我正在将 OmniAuth 与 Rails 3.1.4 一起使用,并且我试图允许已经过身份验证的用户将多个 OpenID 提供者与其帐户相关联。
作为未经身份验证的用户,使用 OpenID 登录可以正常工作。作为经过身份验证的用户,当我尝试使用不同的 oid 提供程序登录时,执行回调方法时,看起来我之前没有经过身份验证。
对我来说,它看起来就像控制器在会话初始化之前执行(或会话被完全跳过)。
会是什么呢?
确认 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 身份验证。
干杯
请记住,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)
至于我,我必须用 Intuit 实现一个应用程序,并遇到同样的问题。为我解决的不是删除保护伪造或跳过authenticity_token
检查,而是确保我在本地提交授权表单的页面与重定向 URL 具有相同的主机。我有127.0.0.1:3000
,但 redirect_url 是localhost:3000
.