开发者问题收集

为什么在 NextAuth 会话回调中用户对象未定义?

2022-05-01
15452

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

[next-auth][error][JWT_SESSION_ERROR] https://next-auth.js.org/errors#jwt_session_error Cannot read properties of undefined (reading '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
    }
  }
})
3个回答

你可以这样做

    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 
        }
    },
}); ```
Murad Zeynallı
2022-10-31

您可以通过 @types/next-auth 添加以下内容的 auth.d.ts 文件来增强 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

stonkz
2022-12-02

假设这是您的代码

callbacks: {
async jwt({ token, user }) {

  token.user = user

  return token
},

因此,令牌和用户第一次都有数据,我们假设令牌和用户将在结构中

token = {
   id: "123",
   emeail: "[email protected]"
  }
 user = {
    name: "name"
    age: 34
   }

出于某种原因,next-auth 会一次又一次地触发此回调,但如果您修改代码,例如

if(user) {
 token.user = user
  }

然后,如果您控制台您的令牌和用户,您可以看到,在用户未定义的情况下,令牌将具有用户对象,例如

token = {
 id: "123",
 email: "[email protected]"
 user: {
  name: "name"
  age: 34
  }
 }
 user = undefined

因此,如果您使用 if 条件将用户分配给令牌,只要用户在 next-auth 中未定义,令牌中就会有用户对象,反之亦然。所以它要么是

    token = {
      id: "123",
      email: "[email protected]"
      user: {
       name: "name"
       age: 34
       }
     }


 user = undefined

 token = {
   id: "123",
   email: "[email protected]"
   }


 user = {
    name: "name"
    age: 34
    }
   }
Pran R.V
2023-11-24