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

Nuxt 3 @sidebase/nuxt-auth:如何修改会话数据及配置[...].ts?

问题描述

我有一个user/profile接口,返回的JSON数据结构如下:

{ "data": { "first_name": "Rafael", "last_name": "Rafael", "email": "rafael@mail.com", "phone": "+7111111111" }, "message": "Completed successfully", "status": true }

使用@sidebase/nuxt-auth的local类型provider时,会话默认会保存该接口的全部返回数据,但我只需要其中的data字段。当前我的nuxt.config.ts配置已给出,请问需要在server/api/auth/[...].ts中编写什么内容?

解决方案

你需要在server/api/auth/[...].ts中自定义会话处理的回调逻辑,提取user/profile返回的data字段作为会话的用户信息。以下是完整的代码实现:

import { NuxtAuthHandler } from '#auth'
import CredentialsProvider from 'next-auth/providers/credentials'

export default NuxtAuthHandler({
  // 对应nuxt.config.ts中的authSecret
  secret: process.env.NUXT_AUTH_SECRET || '12345678',
  providers: [
    // 使用CredentialsProvider对应local类型的认证
    CredentialsProvider.default({
      name: 'Credentials',
      // 定义登录时需要的凭证字段,根据你的登录接口调整
      credentials: {
        email: { label: '邮箱', type: 'email' },
        password: { label: '密码', type: 'password' }
      },
      // 登录验证逻辑:调用后端登录接口校验凭证
      async authorize(credentials: any) {
        if (!credentials?.email || !credentials?.password) {
          return null
        }

        const res = await fetch(`${process.env.NUXT_AUTH_BASE_URL}/login`, {
          method: 'POST',
          body: JSON.stringify({
            email: credentials.email,
            password: credentials.password
          }),
          headers: { 'Content-Type': 'application/json' }
        })

        const loginResult = await res.json()

        // 登录成功则返回包含token和用户信息的对象
        if (loginResult.status && loginResult.data?.token) {
          return { ...loginResult.data }
        }

        // 验证失败返回null
        return null
      }
    })
  ],
  callbacks: {
    // 处理会话数据:获取用户信息并只保留data字段
    async session({ session, token }) {
      if (!token.accessToken) {
        return session
      }

      // 调用user/profile接口获取用户详情
      const profileRes = await fetch(`${process.env.NUXT_AUTH_BASE_URL}/user/profile`, {
        headers: {
          Authorization: `${token.token_type || ''} ${token.accessToken}`
        }
      })

      const profileData = await profileRes.json()

      // 将接口返回的data字段赋值给session.user,覆盖默认的会话数据
      if (profileData.status && profileData.data) {
        session.user = profileData.data
      }

      return session
    },
    // JWT回调:保存登录时获取的token和用户信息
    async jwt({ token, user }) {
      // 用户登录成功时,将接口返回的信息存入JWT
      if (user) {
        token.accessToken = user.token
        token.token_type = user.token_type // 如果你的登录接口返回token类型的话
      }
      return token
    }
  }
})

关键说明

  1. authorize函数:负责调用后端登录接口,验证用户凭证,登录成功后返回包含token的用户数据,供后续JWT和会话使用。
  2. callbacks.jwt:将登录时获取的token存入JWT,后续调用user/profile接口时需要用这个token做身份授权。
  3. callbacks.session:这是核心处理逻辑,调用user/profile接口后,只提取返回的data字段赋值给session.user,这样前端获取到的会话数据就只有你需要的用户信息,不会包含message、status等冗余字段。

另外,建议将nuxt.config.ts中的baseURL配置到环境变量中,避免硬编码,保持和[...].ts中的配置一致。

内容的提问来源于stack exchange,提问作者Rafael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:22:26