Auth.js v5调用auth()时出现读取'name'未定义错误求助
使用Auth.js v5 5.0.0-beta.21版本实现GitLab登录,登录流程正常,但在服务器组件中调用const session = await auth()时返回null,并抛出错误:
[auth][error] JWTSessionError: Read more at https://errors.authjs.dev#jwtsessionerror
[auth][cause]: TypeError: Cannot read properties of undefined (reading 'name')
at Module.session (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/actions/session.js:37:41)
at async AuthInternal (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/index.js:47:24)
at async Auth (webpack-internal:///(rsc)/./node_modules/@auth/core/index.js:127:34)
at async OverviewPage (webpack-internal:///(rsc)/./src/app/intake/overview/page.tsx:15:25)
[auth][details]: {}
当前auth.ts配置代码:
export const { handlers, signIn, signOut, auth } = NextAuth({ providers: [ GitLab({ authorization: `${GITLAB_URL}/oauth/authorize?scope=read_user`, token: `${GITLAB_URL}/oauth/token`, userinfo: `${GITLAB_URL}/api/v4/user`, }) ], callbacks: { jwt({ token, user, account, trigger }) { if (user) { token.id = user.id } if (account?.provider === "GitLab") { return { ...token, accessToken: account?.access_token } } }, session({ session, token }) { session.user.id = token.id session.accessToken = token.accessToken return session }, }, session: { strategy: "jwt", }, })
仅需获取令牌调用后端接口,不关注用户信息,请问配置哪里出错了?
问题出在jwt回调函数的返回逻辑:
- 当
account?.provider !== "GitLab"或该条件不触发时,jwt回调没有返回任何值,导致token变为undefined,后续session解析时尝试读取token.name就会抛出"Cannot read properties of undefined (reading 'name')"错误。
修改步骤:
- 确保jwt回调在所有分支都返回token对象,哪怕条件不满足也要返回原始token:
jwt({ token, user, account, trigger }) { if (user) { token.id = user.id } if (account?.provider === "GitLab") { token.accessToken = account.access_token } // 必须始终返回token,不能仅在特定条件下返回 return token },
- session回调中
session.accessToken的赋值可保留,token上的accessToken字段会被正确传递。
修改后的完整auth.ts配置:
export const { handlers, signIn, signOut, auth } = NextAuth({ providers: [ GitLab({ authorization: `${GITLAB_URL}/oauth/authorize?scope=read_user`, token: `${GITLAB_URL}/oauth/token`, userinfo: `${GITLAB_URL}/api/v4/user`, }) ], callbacks: { jwt({ token, user, account, trigger }) { if (user) { token.id = user.id } if (account?.provider === "GitLab") { token.accessToken = account.access_token } return token }, session({ session, token }) { session.user.id = token.id session.accessToken = token.accessToken return session }, }, session: { strategy: "jwt", }, })
内容的提问来源于stack exchange,提问作者JulienD

