【问题标题】:Why did user object is undefined in NextAuth session callback?为什么在 NextAuth 会话回调中未定义用户对象?
【发布时间】:2022-12-03 06:54:51
【问题描述】:

我使用 NextAuth 与 discord 提供者进行登录,我需要将 userID 添加到会话对象中。为此,我使用会话回调,但用户对象未定义。当我尝试将 userID 添加到会话对象时,出现如下错误:

[下一个授权][错误][JWT_SESSION_ERROR] https://next-auth.js.org/errors#jwt_session_error 无法读取未定义的属性(读取“id”)

确实,用户对象似乎未定义,但我没有任何解决方案。

export default NextAuth({
  providers: [
    DiscordProvider({
      clientId: process.env.DISCORD_CLIENT_ID,
      clientSecret: process.env.DISCORD_CLIENT_SECRET,
      authorization: { params: { scope: 'identify' } }
    })
  ],
  session: {
    jwt: true
  },
  jwt: {
    secret: process.env.JWT_SECRET
  },
  callbacks: {
    async session({session, user}) {
      session.user.id = user.id
      return session
    },
    async jwt(token) {
      return token
    }
  }
})

【问题讨论】:

  • 它很可能会抱怨 session.user 未定义,因此当您尝试访问其 id 属性时会抛出错误。如果你改为 session.user = user 怎么办?

标签: javascript reactjs next.js jwt next-auth


【解决方案1】:

你可以那样做

    providers: [ 
        Github({
            clientId: process.env.GITHUB_ID,
            clientSecret:process.env.GITHUB_SECRET,
        })
    ],
    database :process.env.DB_URL,
    session:{
        jwt:true
    },
    adapter: MongoDBAdapter(clientPromise, {
        databaseName: 'AuthDb'
      }),
    jwt:{
        secret: 'secretCode',
    },
    callbacks:{
        async jwt({token,user}){
            if(user){
                token.id = user.id
            }
            return token
        },
        async session(session,token) {
            session.user.id =token.id
            return session 
        }
    },
}); ```

【讨论】:

    【解决方案2】:

    您可以通过添加包含以下内容的 auth.d.ts 文件来使用 @types/next-auth 扩充 next-auth 会话类型:

    import "next-auth";
    
    declare module "next-auth" {
      interface User {
        id: string | number;
      }
    
      interface Session {
        user: User;
      }
    }
    

    更多相关信息:https://github.com/nextauthjs/next-auth/issues/671

    【讨论】:

      【解决方案3】:

      您可以在回调中这样做:-

      callbacks: {
        jwt:({token,user})=>{
          if(user){
            token.id = user.userId;
          }
          return token;
        },
        session:({session,token}) =>{
          if(token){
            session.user.id = token.id;
          }
          return session;
        }
      }
      

      并且不要忘记在回调之前执行的函数中返回用户,否则它会告诉未定义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-21
        • 1970-01-01
        相关资源
        最近更新 更多