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”变量。

我觉得我错过了一些愚蠢的东西。有什么想法吗?

4

1 回答 1

3

我认为还有另一个关于让单个 cookie 跨子域工作的问题可以回答你的问题:

https://stackoverflow.com/a/10403338/2573896

此外,我可以想象使用带有 dalli 和 memcached 的 memcached 集群作为会话存储也可以:

http://awesomerails.wordpress.com/2011/08/23/rails-3-memcached-session-store/

出于您的应用程序的目的,第一个解决方案更有意义。

于 2013-09-03T23:16:40.790 回答