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

NextAuth.js获取accessToken失败,仅返回iat、exp、jti求助

解决NextAuth.js无法获取accessToken的问题

你遇到的问题核心在于未正确传递和存储accessToken,同时存在配置拼写错误,以下是具体修复方案:

1. 修正配置拼写错误

首先修复secret的拼写错误(你写的是sectret),这会导致JWT签名异常:

export default NextAuth({
  secret: process.env.NEXTAUTH_SECRET, // 修正拼写
  // ...其他配置
})

2. 在authorize中返回accessToken

CredentialsProvider不会自动处理自定义登录接口的token,需要从接口响应中取出accessToken,和用户信息一起返回:

async authorize(credentials, req) {
  const res = await fetch("http://localhost:3000/api/user/login", {
    method: "POST",
    body: JSON.stringify(credentials),
    headers: { "Content-Type": "application/json" },
  });
  const resJson = await res.json();
  const user = resJson.user;
  const accessToken = resJson.accessToken; // 从接口响应中提取token

  if (user && accessToken) {
    // 将token和用户信息一起返回,这个对象会传入jwt回调的user参数
    return { ...user, accessToken };
  } else {
    return null;
  }
}

3. 在jwt回调中存储accessToken

jwt回调是处理JWT内容的关键,需要将拿到的accessToken附加到JWT对象中:

async jwt({ token, user }) {
  // 仅在首次登录时(user存在)存入token和用户核心信息
  if (user) {
    token.accessToken = user.accessToken;
    token.id = user.id;
    token.name = user.name;
  }
  return token;
}

4. 在session回调中传递token到前端

最后在session回调里,把JWT中的accessToken挂载到session对象,让前端可以通过useSession获取:

async session({ session, token }) {
  session.user = {
    ...session.user,
    id: token.id,
    name: token.name,
    accessToken: token.accessToken // 将token加入session
  };
  return session;
}

完整修复后的配置代码

import NextAuth from "next-auth"
import CredentialsProvider from "next-auth/providers/credentials"

export default NextAuth({
  secret: process.env.NEXTAUTH_SECRET,
  session: {
    strategy: "jwt",
  },
  providers: [
    CredentialsProvider({
      name: 'Credentials',
      type: 'credentials',
      credentials: {},
      async authorize(credentials, req) {
        const res = await fetch("http://localhost:3000/api/user/login", {
          method: "POST",
          body: JSON.stringify(credentials),
          headers: { "Content-Type": "application/json" },
        });
        const resJson = await res.json();
        const user = resJson.user;
        const accessToken = resJson.accessToken;
        
        if (user && accessToken) {
          return { ...user, accessToken };
        } else {
          return null;
        }
      }
    })
  ],
  callbacks: {
    async jwt({ token, user }) {
      if (user) {
        token.accessToken = user.accessToken;
        token.id = user.id;
        token.name = user.name;
      }
      return token;
    },
    async session({ session, token }) {
      session.user = {
        ...session.user,
        id: token.id,
        name: token.name,
        accessToken: token.accessToken
      };
      return session;
    },
  },
  pages: {
    signIn: '/auth/signin',
  }
})

关键说明

  • CredentialsProvider的authorize返回值会作为jwt回调的user参数传入,因此必须在这里包含accessToken。
  • JWT回调仅在首次登录(user存在)时存入token,后续session续期时会自动携带已存储的内容。
  • 前端通过useSession()钩子即可获取包含accessToken的session对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:45:20