Войти в систему сразу после регистрации пользователя
Я использую аутентификацию с помощью токена devise (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, но он не выполняется вообще после успешной регистрации.
1 ответ
Не слишком сложно. После создания пользователя просто позвоните sign_in
и передать ресурс (пользователь).
https://github.com/plataformatec/devise/wiki/How-To:-Sign-in-from-a-controller
Пример:
sign_in @current_user
Devise::RegistrationController
на самом деле, уже делает это.
Кроме того, так как вы используете DeviseTokenAuth
gem
и DeviseTokenAuth::RegistrationsController
контроллер наследует от Devise
собственный базовый контроллер, вы (должны) иметь доступ ко всем помощникам, которые Devise
контроллеры делают.
Одна реализация может выглядеть следующим образом.
class Users::RegistrationsController < DeviseTokenAuth::RegistrationsController
def create
super do |resource|
sign_in(resource)
end
end
end