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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:43:16