NextAuth类型错误:Session无accessToken属性,本地构建正常GitHub构建失败
解决GitHub CI构建时NextAuth Session类型错误问题
1. 扩展NextAuth的Session类型(核心修复)
NextAuth默认的Session类型不包含accessToken,必须手动扩展类型定义。在你的[...nextauth].ts文件顶部添加以下代码:
import NextAuth from "next-auth"; import { JWT } from "next-auth/jwt"; // 扩展NextAuth的Session、User和JWT类型 declare module "next-auth" { interface Session { accessToken?: string; } interface User { accessToken?: string; } } declare module "next-auth/jwt" { interface JWT { accessToken?: string; } }
如果单独维护类型文件,确保tsconfig.json的include数组包含该文件路径,比如:
{ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "./types/auth.d.ts"] }
2. 确保依赖版本与本地一致
本地构建正常但CI失败,大概率是依赖版本不一致:
- 检查
package.json中next-auth的版本号,尽量使用精确版本(去掉^或~前缀) - 确保
yarn.lock已提交到GitHub仓库,CI执行yarn install时会严格按照lock文件安装依赖,避免版本漂移
3. 统一TypeScript配置
对比本地与CI环境的tsconfig.json,重点检查以下配置:
strict: 若CI开启了strict: true而本地未开启,会触发更严格的类型检查,暴露本地未发现的问题noImplicitAny: 该选项开启时,未明确类型的变量会报错,确保本地和CI配置一致
4. 正确配置NextAuth回调(v4版本)
如果使用NextAuth v4,需要在callbacks中将accessToken从JWT传递到Session:
export default NextAuth({ // 其他配置... callbacks: { async jwt({ token, user }) { // 用户登录时将accessToken存入JWT if (user) { token.accessToken = user.accessToken; } return token; }, async session({ session, token }) { // 将JWT中的accessToken同步到Session session.accessToken = token.accessToken; return session; }, }, });
5. 排查NextAuth版本差异
如果本地和CI的NextAuth版本不同(比如v3 vs v4),Session结构会有本质区别:
- v3中
accessToken可能直接在Session对象中,v4则必须通过回调手动传递 - 查看
yarn.lock中的next-auth版本,确保CI与本地完全一致
内容的提问来源于stack exchange,提问作者QuentinC
相关产品推荐
相关产品推荐

