Next-Auth(凭证模式):如何将服务器完整响应传递至客户端
问题原因及解决方法
你的问题出在jwt和session回调的配置上,Next-Auth默认只会同步name、email、image这类基础字段到session,服务器返回的额外字段需要手动在回调里处理:
1. 错误点分析
jwt回调仅返回原token,没有把authorize方法返回的完整用户数据(包括advertising_id、api_key)存入tokensession回调里直接使用的user参数,在凭证模式下并非你从服务器拿到的完整数据,而是Next-Auth处理后的简化版本
2. 修改后的配置代码
const authOptions: NextAuthOptions = { providers: [ CredentialsProvider({ id: 'credentials', name: 'credentials', credentials: {}, async authorize(credentials) { const { email, password } = credentials as { email: string; password: string } const uuid = uuidv4() const res = await fetch("https://myapi.blabla/api/v9/accounts/sign-in/", { headers: { Authorization: `uuid ${uuid}`, "Client-Id": "vrfyrvKmSIRs8s1BZuHcmHNaZuTR2nIF0ZgFt39", "Content-Type": "application/json" }, method: "POST", body: JSON.stringify({ email, password }) }) const user = await res.json() if (!res.ok) { throw new Error(user.message) } if (res.ok && user) { return user } return null } }) ], pages: { signIn: '/login' }, callbacks: { // 修改jwt回调:把服务器返回的完整用户数据合并到token jwt: async ({ token, user }) => { // 仅登录时会传入user参数,此时把所有字段存入token if (user) { return { ...token, ...user } } // 后续请求直接返回现有token return token }, // 修改session回调:从token中取出完整数据赋值给session.user session({ session, token }) { session.user = token as any return session }, } }
3. 关键说明
- 在
jwt回调中,用户首次登录时user参数就是服务器返回的完整响应,将其与token合并后,所有字段都会被存储 - 在
session回调中,直接从token里取数据赋值给session.user,前端通过useSession()就能获取到包括advertising_id、api_key在内的全部字段
内容的提问来源于stack exchange,提问作者Andres Bedoya
相关产品推荐
相关产品推荐

