我正在尝试为example.com的不同子域托管的多个rails(v3.2)应用实施单点登录解决方案
一个应用程序充当身份提供者,使用设计用于身份验证,并位于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”变量。
我觉得我错过了一些愚蠢的东西......任何想法可能是什么?
答案 0 :(得分:3)
我认为还有另一个问题是如何让单个cookie在可以回答你的子域之间工作:
https://stackoverflow.com/a/10403338/2573896
另外,我可以想象使用带有dalli和memcached的memcached群集作为会话存储也可以正常工作:
http://awesomerails.wordpress.com/2011/08/23/rails-3-memcached-session-store/
出于您的应用目的,第一种解决方案更有意义。