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

htrmnn0y  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(114)

我使用NextAuth来登录discord提供程序,我需要将userID添加到会话对象中。为此,我使用了会话回调,但用户对象未定义。当我尝试将userID添加到会话对象中时,我得到了如下错误:
[next-auth][错误][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
    }
  }
})
f0brbegy

f0brbegy1#

你可以这样做

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 
        }
    },
}); ```
vc9ivgsu

vc9ivgsu2#

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

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

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

相关问题