0

我正在使用设计令牌身份验证(devise_token_auth)进行基于令牌的用户登录和注册,因为它仅用于开发 api。我需要在用户注册他/她的帐户后立即让用户登录。我怎么能这样做?我已经尝试过但无法成功,所以我在这里希望得到帮助。

class Users::RegistrationsController < DeviseTokenAuth::RegistrationsController
  prepend_before_action :configure_permitted_parameters
    protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:account_update, keys: [:id, :first_name, :last_name, :phone, :status])
      devise_parameter_sanitizer.permit(:sign_up, keys: [:confirm_success_url])
    end

  private

    def user_params
      params.permit.all #(:id, :email, :firstname, :lastname, :phone, :status)
    end
end

Rails.application.routes.draw do
  # devise_for :users, controllers: { confirmations: 'confirmations' }
  mount_devise_token_auth_for 'User', at: 'auth', controllers: {
     # confirmations: 'confirmations',
      registrations: 'users/registrations',
      passwords: 'users/passwords'
  }

class ApplicationController < ActionController::API
  before_action :authenticate_user!
  include DeviseTokenAuth::Concerns::SetUserByToken

  def authenticate_current_user
    head :unauthorized if get_current_user.nil?
  end

  def get_current_user
    return nil unless cookies[:auth_headers]
    auth_headers = JSON.parse cookies[:auth_headers]
    puts('################################')
    puts('auth_headers', auth_headers)
    expiration_datetime = DateTime.strptime(auth_headers["expiry"], "%s")
    current_user = User.find_by(uid: auth_headers["uid"])

    if current_user &&
       current_user.tokens.has_key?(auth_headers["client"]) &&
       expiration_datetime > DateTime.now

       @current_user = current_user
    end

    @current_user
  end

end

我在下面的代码中尝试了这个

def after_sign_up_path_for(resource)
      puts('it should be shown')
      puts('################################')
      puts('resource', resource)
      puts('header', request.headers['client'])
      client_id = request.headers['client']
      new_auth_header = @resource.create_new_auth_token(client_id)
      response.headers.merge!(new_auth_header)
  end

在 Users::RegistrationController 但成功注册后根本不执行。

4

1 回答 1

0

不太复杂。创建用户后,只需调用sign_in并传递资源(用户)。

https://github.com/plataformatec/devise/wiki/How-To:-Sign-in-from-a-controller

例子:

sign_in @current_user

Devise::RegistrationController事实上,已经这样做了。

此外,由于您使用的是并且控制器继承自自己的基本控制器,因此您(应该)可以访问控制器所做的所有帮助程序。DeviseTokenAuth gemDeviseTokenAuth::RegistrationsController DeviseDevise

一种实现可能如下所示。

class Users::RegistrationsController < DeviseTokenAuth::RegistrationsController
  def create
    super do |resource|
      sign_in(resource)
    end
  end
end
于 2018-03-12T17:56:27.680 回答