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

时间:2016-10-20 15:59:04

标签: ruby-on-rails authentication ruby-on-rails-5 data-migration auth0

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

用户被保存到具有多个关联的用户模型(签入/注释等)。如何将Auth0用户链接到数据库上的用户记录。我想我可以通过电子邮件(因为它们将是唯一的)或Auth0用户ID(并在用户表中添加新列)进行登录。看起来我可以简单地使用Auth0登录回调来签署用户(使用我当前的会话控制器)但是如何在OmniAuth中创建用户时在数据库上创建用户。这也有回调吗?

在一个完美的世界里,我想做一些像:

  1. 用户使用Auth0锁定注册。在Auth0数据库上创建新帐户。
  2. 回调会触发在我的数据库上创建的新记录,其中包含来自Auth0的所有信息,并且包含关联列。
  3. 用户登录并且他们的user_id(来自我的数据库)存储在会话中。
  4. 用户对个人信息(姓名/电子邮件/等)的更改在两个数据库中都已更改。
  5. 我想要的是什么?或者我应该坚持我目前的身份验证?

1 个答案:

答案 0 :(得分:3)

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

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

基本上,OmniAuth的OAuth流程如下:

  1. 用户单击将用户重定向到提供者OAuth门户的链接。 (或者在Auth0的情况下,它是一个花哨的JS Widget)
  2. 提供程序重定向回您的应用程序,并转到回调控制器上的callbackfailure方法。
  3. 此时,用户可以是新用户或返回用户。因此,您尝试根据auth hash中的uid或在auth哈希中创建新用户来查找应用程序中的用户。
  4. 您登录并重定向用户。
  5. 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
    

    请参阅: