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 } } })
关键说明
authorize函数:负责调用后端登录接口,验证用户凭证,登录成功后返回包含token的用户数据,供后续JWT和会话使用。callbacks.jwt:将登录时获取的token存入JWT,后续调用user/profile接口时需要用这个token做身份授权。callbacks.session:这是核心处理逻辑,调用user/profile接口后,只提取返回的data字段赋值给session.user,这样前端获取到的会话数据就只有你需要的用户信息,不会包含message、status等冗余字段。
另外,建议将nuxt.config.ts中的baseURL配置到环境变量中,避免硬编码,保持和[...].ts中的配置一致。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

