Rails & Devise - 跨子域自动登录

Rya*_*anB 1 ruby activerecord ruby-on-rails devise rails-postgresql

设置

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

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

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

问题

我的问题涉及到第3步。我想将用户重定向到他们的子域名和记录它们自动而不是要求他们登录的。不过,我希望在所有子域共享一个会话。

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

可能的解决方案

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

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

想法?谢谢!

小智 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])

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

  • 销毁密钥:

    key.destroy

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