Rails&设计 - 跨子域的自动登录

时间:2013-11-12 02:40:41

标签: ruby-on-rails ruby activerecord devise rails-postgresql

设置

我有一个Rails应用程序,用户注册一个帐户,并为他们创建一个子域。然后,他们可以进入子域并使用其凭据登录。工作流程看起来像这样:

  1. 用户访问基础域填写了包含电子邮件/用户名/密码和子域字段
  2. 的表单
  3. 从提交的信息中,服务器在全局/公共数据库中创建一个帐户。然后,服务器创建一个特定于该特定子域/帐户的数据库,并将用户记录存储在其中。
  4. 用户被重定向到他们的子域,并被要求登录。
  5. (注意:要实现单独的“数据库”,我使用的是postgres模式,但这应该是无关紧要的。)

    问题

    我的问题涉及第3步。我想将用户重定向到他们的子域并自动登录,而不是要求他们登录。但是,我想要共享一个会话遍布所有子域。

    我想以某种方式安全地传输自动登录请求。

    可能的解决方案

    我考虑过使用一次性随机令牌,我会将其存储在Cookie和users表中。用户成功创建帐户后,他将被重定向到子域。此时令牌将被消耗/销毁,用户将自动登录。

    我还需要在到期前使​​用令牌的短窗口。

    思考?谢谢!

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,你建议的可能解决方案不起作用,因为子域之间没有共享会话。

我通过以下方式解决了它(你提出了相同的想法,不同的实现):

  • 创建一个包含user_id和随机SHA1密钥的新模型(我称之为LoginKey)。
  • 当用户在父域中进行身份验证时(例如:mydomain.com/users/sign_in),将创建一个新的LoginKey,并将用户重定向到相应的子域,以执行我称为login_with_key的操作(例如: user_subdomain.mydomain.com/users/login_with_key?key=f6bb001ca50709efb22ba9b897d928086cb5d755322a3278f69be4d4daf54bbb)
  • 使用提供的密钥自动登录用户:

    key = LoginKey.find_by_login_key(params [:key])

    sign_in(key.user)除非是key.nil?

  • 销毁钥匙:

    key.destroy

我不喜欢这个解决方案100%,我尝试了很多不同的方法,不需要创建db记录,但总是面临安全问题,我认为这个是安全的。