NextAuth Credentials登录时,useSession钩子无法获取Token?求解决方案
解决NextAuth Credentials登录后useSession无法获取自定义Token的问题
使用NextAuth的CredentialsProvider实现登录时,若在authorize函数中返回了包含自定义token字段的用户对象,但通过useSession钩子获取的session里没有该token,无法用于调用后端REST API,可通过以下方式解决:
NextAuth默认仅将标准用户字段(如name、email、id)存入session,自定义字段需要通过jwt和session回调手动处理,具体步骤如下:
- 配置
jwt回调:在authOptions中添加jwt回调函数,将自定义token从用户对象存入JWT payload。 - 配置
session回调:将JWT中的token字段映射到session对象,使其能被前端通过useSession访问。
修改后的完整代码示例:
import NextAuth, { AuthOptions } from 'next-auth'; import CredentialsProvider from 'next-auth/providers/credentials'; import { getProfile } from 'utility/api/audience'; export const authOptions: AuthOptions = { providers: [ CredentialsProvider({ name: 'Credentials', credentials: { token: { label: 'Token', type: 'text' }, }, async authorize(credentials) { if (!credentials?.token) return null; const token = credentials.token; const { profile } = await getProfile(token); if (profile) return { email: profile.data.email, name: profile.data.fullName, id: profile.id, token, // 自定义字段 }; else return null; }, }), ], // 添加回调配置 callbacks: { async jwt({ token, user }) { // 登录时将user中的自定义token存入JWT if (user) { token.token = user.token; } return token; }, async session({ session, token }) { // 将JWT中的token映射到session对象 if (session.user) { (session.user as any).token = token.token; } return session; }, }, session: { strategy: 'jwt', // Credentials模式默认使用jwt,显式声明更清晰 }, }; export default NextAuth(authOptions);
补充说明
jwt回调在每次JWT创建或更新时触发,登录阶段user参数会包含authorize返回的完整对象,此时可将自定义字段存入JWT。session回调负责把JWT中的数据映射到前端可见的session对象,确保自定义token能被useSession获取到。- 若使用TypeScript,建议扩展NextAuth类型定义以避免类型断言:
import NextAuth from 'next-auth'; declare module 'next-auth' { interface User { token: string; } interface Session { user: User; } } declare module 'next-auth/jwt' { interface JWT { token: string; } }
内容的提问来源于stack exchange,提问作者Solid1
相关产品推荐
相关产品推荐

