Next-auth回调返回access_token,但getServerSession获取该值为undefined
JWT回调未正确返回更新后的token
登录时account参数仅会出现一次,必须在此时将access_token附加到返回的token对象中,否则后续请求会丢失该字段。示例代码:async jwt({ token, account }) { // 仅在首次登录/令牌更新时处理account数据 if (account) { token.access_token = account.access_token; } return token; }Session回调未完成token到session的映射
即便JWT中已存储access_token,若session回调未将其从token中取出并挂载到session对象,前端和服务端都无法获取到该值。正确写法:async session({ session, token }) { // 将access_token挂载到session的自定义字段下 session.user.access_token = token.access_token; return session; }CognitoProvider未配置正确的scope
若未在provider配置中指定包含openid的scope,Cognito不会返回access_token。需确保配置如下:CognitoProvider({ clientId: process.env.COGNITO_CLIENT_ID, clientSecret: process.env.COGNITO_CLIENT_SECRET, issuer: process.env.COGNITO_ISSUER, scope: "openid email profile", // 必须包含openid })同时要确认Cognito用户池的应用客户端已启用对应scope。
Session模式未正确设置为jwt
需明确在NextAuth配置中指定session策略为jwt,否则JWT回调不会生效:export const authOptions = { providers: [CognitoProvider(...)], session: { strategy: "jwt", // 必须显式设置 }, callbacks: { jwt: ..., session: ... }, };令牌刷新逻辑缺失
access_token过期后,若未实现刷新逻辑,后续token中的access_token会丢失。需在jwt回调中添加刷新逻辑:async jwt({ token, account }) { // 自定义判断access_token是否过期 const isExpired = Date.now() > token.expires_at; if (isExpired && token.refresh_token) { // 调用Cognito刷新接口获取新令牌 const newTokens = await fetch(`${process.env.COGNITO_ISSUER}/oauth2/token`, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ grant_type: "refresh_token", client_id: process.env.COGNITO_CLIENT_ID, refresh_token: token.refresh_token, }), }).then(res => res.json()); token.access_token = newTokens.access_token; token.expires_at = Date.now() + newTokens.expires_in * 1000; } return token; }服务端组件调用getServerSession未传入authOptions
在Next.js 13+ App Router的服务端组件中,必须显式传入authOptions才能正确获取包含自定义字段的session:import { getServerSession } from "next-auth/next"; import { authOptions } from "@/app/api/auth/[...nextauth]/route"; export default async function ServerComponent() { const session = await getServerSession(authOptions); console.log(session?.user?.access_token); // ...组件逻辑 }环境变量配置错误
检查Cognito的issuer是否为正确的用户池OIDC地址(格式为https://cognito-idp.<region>.amazonaws.com/<userPoolId>),若地址错误,NextAuth无法正确解析令牌,导致access_token无法被保留。
内容的提问来源于stack exchange,提问作者Dennis Kuijs

