使用devise-auth-token实现登录后将授权令牌返回至用户字段
实现devise-auth-token登录时将令牌返回至用户字段
要实现登录成功后,在返回的用户数据中(与头像、昵称同级)包含授权令牌,你可以通过重写devise-auth-token的登录控制器方法来实现:
1. 创建自定义登录控制器
继承DeviseTokenAuth::SessionsController并重写登录成功的响应方法:
# app/controllers/users/sessions_controller.rb class Users::SessionsController < DeviseTokenAuth::SessionsController protected def render_create_success # 提取当前生成的令牌相关参数 token_info = { token: @token, client: @client_id, uid: @resource.uid } # 将令牌信息合并到用户数据中(根据你的实际需求调整序列化字段) user_response = @resource.as_json(only: [:id, :nickname], methods: [:avatar_url]) user_response.merge!(token_info) render json: { data: user_response } end end
2. 修改路由指向自定义控制器
在config/routes.rb中更新devise_token_auth的路由配置:
Rails.application.routes.draw do devise_token_auth_for :users, controllers: { sessions: 'users/sessions' } end
3. (可选)使用序列化器统一处理用户响应
如果需要更规范的用户数据序列化,可创建用户序列化器:
# app/serializers/user_serializer.rb class UserSerializer < ActiveModel::Serializer attributes :id, :nickname, :avatar_url, :token, :client, :uid def avatar_url # 根据你实际的头像存储方式调整,示例用ActiveStorage object.avatar.attached? ? rails_blob_url(object.avatar) : nil end def token instance_options[:token] end def client instance_options[:client] end def uid instance_options[:uid] end end
然后在登录控制器的render_create_success方法中使用序列化器:
def render_create_success serialized_user = UserSerializer.new( @resource, token: @token, client: @client_id, uid: @resource.uid ).serializable_hash render json: { data: serialized_user } end
完成以上配置后,用户登录成功时,返回的JSON数据中,用户字段会直接包含token、client、uid这些授权令牌相关参数,与昵称、头像等字段同级。
内容的提问来源于stack exchange,提问作者Muhammad Ans
相关产品推荐
相关产品推荐

