在不同子域名的Rails应用之间共享会话

18

我正在尝试为 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” 变量现在缺失了。

我觉得我可能忽略了一些非常简单的东西..您认为会是什么原因呢?


你解决了这个问题吗?我正试图完全实现同样的事情。 - Jakcst
user.key 是否保存在 cookie 中的某个地方?也许 cookie 域没有设置为 *.example.com,而是设置为 users.example.com?(编辑:按下回车键会过早提交。)所有单独的应用程序是否都会访问 users.example.com 来验证会话?或者换句话说,在您对系统的理解下,app1.example.com 如何验证其会话?会话存储在哪里?共享数据库? - dbalatero
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接