1

设置

我有一个 Rails 应用程序,用户在其中注册一个帐户,并为他们创建一个子域。然后他们可以进入子域并使用他们的凭据登录。工作流程如下所示:

  1. 用户访问基域填写包含电子邮件/用户名/密码和子域字段的表单
  2. 根据提交的信息,服务器在全局/公共数据库中创建一个帐户。然后服务器创建一个特定于该特定子域/帐户的数据库,并将用户记录存储在其中。
  3. 用户被重定向到他们的子域,并要求登录。

(注意:为了实现单独的“数据库”,我使用的是 postgres 模式,但这应该是无关紧要的。)

问题

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

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

可能的解决方案

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

我还需要一个短窗口,以便在到期前使​​用令牌。

想法?谢谢!

4

1 回答 1

5

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

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

  • 创建一个包含 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])

    登录(key.user)除非key.nil?

  • 销毁钥匙:

    密钥销毁

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

于 2013-12-10T19:11:45.933 回答