Rails:在保留 postgres 记录和关联的同时迁移到 Auth0

Rails: Migrating to Auth0 while retaining postgres records and associations

我的项目目前使用has_secure_password来处理用户(类似于railscast)。一切正常,但展望未来,我觉得切换到 Auth0 会带来好处,并希望在太多用户注册之前立即进行转换。

用户被保存到具有多个关联的用户模型(checkins/comments/etc。)我如何才能将 Auth0 用户 link 保存到我数据库中的用户记录。我想我可以在他们登录后通过电子邮件查找(因为它们是唯一的)或 Auth0 用户 ID(并向用户 table 添加一个新列)。似乎我可以简单地使用 Auth0 登录回调来让用户登录(使用我当前的会话控制器),但是当他们在 OmniAuth 中创建时,我如何在我的数据库上创建用户。是否也有回调?

在一个完美的世界里,我想做这样的事情:

  1. 用户使用 Auth0 锁注册。在 Auth0 数据库上创建一个新帐户。
  2. 回调触发在我的数据库中创建一条新记录,其中包含来自 Auth0 的所有信息并具有关联列。
  3. 用户登录,他们的 user_id(来自我的数据库)存储在会话中。
  4. 用户对个人信息所做的更改(name/email/etc。)在两个数据库上都发生了更改。

我想要的有可能吗?还是我应该坚持使用当前的身份验证?

实施 Auth0 授权与任何其他 OAuth 提供者(例如 Facebook、Twitter、Github 等)之间没有重大区别。Auth0 quickstart guide 有点奇怪,因为它没有显示您如何将 link 凭据提供给应用程序中的用户模型。相反,他们只是将整个 shebang 推到会话中。

您需要对此处的用户模型进行的唯一真正更改是添加一个 uid 列,用于存储用户的 Auth0 uid

OmniAuth 的 OAuth 流程基本上是这样工作的:

  1. 用户单击 link,将用户重定向到提供商 OAuth 门户。 (或者在 Auth0 的情况下,它是一个花哨的 JS 小部件)
  2. 提供商重定向回您的应用程序,它会转到回调控制器上的 callbackfailure 方法。
  3. 此时用户可能是新用户或回访用户。因此,您尝试根据 auth hash 中的 uid 在您的应用程序中找到用户,或者从 auth 哈希创建一个新用户。
  4. 您登录并重定向用户。

class Auth0Controller < ActionController::Base
  # the signed up or logged in on auth0
  # GET "/auth/auth0/callback"
  def callback
    auth_hash = request.env['omniauth.auth']
    @user = User.find_or_intialize_by(uid: auth_hash[:uid]) 

    if @user.new_record?
      @user.name = auth_hash.name
      @user.email = auth_hash.email # etc
      @user.save!
    end

    reset_session
    session[:user_id] = @user.id
    redirect_to root_path, success: "Hello #{@user.name}"
  end

  # the user declined to give your app permissions
  # GET "/auth/failure"
  def failure
    redirect_to root_path, alert: "Oh noes"
  end
end

参见: