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

NextAuth Session无法返回access_token问题求助

问题解决:NextAuth中无法将access_token返回至客户端session

你当前的问题是在NextAuth的session回调中无法获取到access_token——虽然已经在jwt回调里将access_token存入了token对象,但客户端拿到的session里只有name、email、image三个字段。

问题原因

  1. 直接把session.user赋值为token时,NextAuth默认会过滤session.user的结构,只保留预设的name、email、image字段,导致token里的accessToken被丢弃。
  2. 使用数据库适配器时,需明确设置session策略为jwt,否则jwt回调生成的token不会被传递到session回调中。

修复后的代码

export const authOptions: NextAuthOptions = {
  adapter: MongoDBAdapter(clientPromise),
  // 明确设置session策略为jwt,确保token能传递到session回调
  session: {
    strategy: "jwt",
  },
  providers:[
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID!!,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET!!,
    })
  ],
  callbacks: {
    async jwt({ token, account, user }) {   
      // 仅在首次登录(account存在时)存入access_token
      if(account?.access_token) {
        token.accessToken = account.access_token;
      }      
      return token;
    }, 
    async session({ session, token }) {
      // 扩展session对象,将access_token添加到user字段下(或单独作为session根节点字段)
      session.user.accessToken = token.accessToken;
      return session;
    },
  }
}

客户端获取结果示例

修改后客户端拿到的session会包含access_token:

{
  "user": {
    "name": "Max Mustermann",
    "email": "m.mustermann@test.com",
    "image": "https://lh3.googleusercontent.com/a/cweawwqad...=s96-c",
    "accessToken": "ya29.a0AfH6SM..."
  },
  "expires": "2023-06-11T14:23:17.361Z"
}

额外注意事项

  • 若需要长期保存access_token,可结合数据库适配器将其存储到用户表中;jwt策略下token会被加密存储在客户端cookie里,更适合短期使用场景。
  • 确保Google OAuth应用已开启相应权限,且环境变量GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET配置正确。

内容的提问来源于stack exchange,提问作者Captai-N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:05:17