NextAuth Session无法返回access_token问题求助
问题解决:NextAuth中无法将access_token返回至客户端session
你当前的问题是在NextAuth的session回调中无法获取到access_token——虽然已经在jwt回调里将access_token存入了token对象,但客户端拿到的session里只有name、email、image三个字段。
问题原因
- 直接把
session.user赋值为token时,NextAuth默认会过滤session.user的结构,只保留预设的name、email、image字段,导致token里的accessToken被丢弃。 - 使用数据库适配器时,需明确设置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
相关产品推荐
相关产品推荐

