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
相关产品推荐
相关产品推荐

