我正在尝试为 example.com 的不同子域名托管的多个 Rails(v3.2)应用程序实现单点登录解决方案。
一个应用程序作为身份提供者,使用 Devise 进行身份验证,并在 users.example.com 上运行。其他应用程序依赖于身份提供者进行身份验证,使用 Devise+OmniAuth,在 [app1.example.com、app2.example.com 和 example.com] 域中运行。这篇博客启发了我大部分的实现: http://blog.joshsoftware.com/2010/12/16/multiple-applications-with-devise-omniauth-and-single-sign-on/
我的实现已经正常工作,但问题仍然存在,会话并没有共享,所以在身份提供者登录后,我仍然需要从每个其他应用程序进行身份验证,而我需要这对用户来说是无缝的。
我尝试在 secret_token.rb 中使用相同的秘密令牌,在 session_store.rb 中使用相同的会话密钥,以及 :domain => :all(还尝试过使用 '.example.com' 和 'example.com' 作为值)。但仍然没有成功。
通过上述方式,我在 session.inspect 中看到,在身份提供者登录后,会话变量“warden.user.user.key”被填充。当我立即跳转到 app1.example.com 上的应用程序时,session.inspect 显示相同的 session_id 和 _csrf_token,但是 “warden.user.user.key” 变量现在缺失了。
我觉得我可能忽略了一些非常简单的东西..您认为会是什么原因呢?
user.key
是否保存在 cookie 中的某个地方?也许 cookie 域没有设置为 *.example.com,而是设置为 users.example.com?(编辑:按下回车键会过早提交。)所有单独的应用程序是否都会访问users.example.com
来验证会话?或者换句话说,在您对系统的理解下,app1.example.com
如何验证其会话?会话存储在哪里?共享数据库? - dbalatero