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

Next-auth回调返回access_token,但getServerSession获取该值为undefined

NextAuth + Cognito 无法获取 access_token 的可能原因

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:02:14