You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:20:40