NextAuth v5 使用有效对象返回 null

问题描述 投票:0回答:1

我正在尝试使用最新版本的 Auth 创建一个身份验证应用程序,但是在凭据中,所有逻辑从数据库获取用户后,当它将返回到 Session 时,我尝试强制数据查看是否有效,但是没有。

import bcrypt from "bcryptjs"
import type { NextAuthConfig } from "next-auth"
import Credentials from "next-auth/providers/credentials"

import { LoginSchema } from "@/utils/schemas/index"
import getUserByEmail, { } from "@/database/getUserByEmail"

export default {
  providers: [
    Credentials({
      async authorize(credentials): Promise<any> {
        const validatedFields = LoginSchema.safeParse(credentials)

        if (validatedFields.success) {
          const { email, password } = validatedFields.data

          const user = await getUserByEmail(email)
          if (!user || !user.Senha) return null

          const passwordsMatch = await bcrypt.compare(
            password,
            user.Senha,
          )

          if (passwordsMatch) { 
            console.log(typeof user) // is a valid object
            return user
          }
        }

        return null
      }
    })
  ],
} satisfies NextAuthConfig

我的 auth.ts 在这里:

import NextAuth from "next-auth"
import authConfig from "./auth.config"
import { db } from "@/database/db"
import { PrismaAdapter } from "@auth/prisma-adapter"


export const {
    handlers: { GET, POST },
    auth,
    signIn,
    signOut,
} = NextAuth({
    adapter: PrismaAdapter(db),
    session: { strategy: "jwt" },
    ...authConfig,
})

这是我的依赖

reactjs next.js react-hooks next-auth
1个回答
0
投票

console.log(typeof user)
不是一个好的调试方法,因为
console.log(tyepof null)
"object"
。尝试运行此代码:

console.log(typeof null)

尝试记录

user
对象本身并查看真实值:

console.log(user)

您有一些返回的情况

null
:

  1. validatedFields.success === false
  2. !user
  3. !user.Senha
  4. !passwordsMatch

尝试一一调试:

export default {
  providers: [
    Credentials({
      async authorize(credentials): Promise<any> {
        const validatedFields = LoginSchema.safeParse(credentials)

        if (validatedFields.success) {
          const { email, password } = validatedFields.data

          const user = await getUserByEmail(email)
          console.log({user, userSenha: user.Senha})
          if (!user || !user.Senha) return null

          const passwordsMatch = await bcrypt.compare(
            password,
            user.Senha,
          )

          if (passwordsMatch) { 
            console.log(user)
            return user
          } else {
            console.log("Password didn't match")
            return null
          }
        } else {
          console.log("Credentials are not valid")
          return null
        }

        // You can get rid of this return
        return null
      }
    })
  ],
} satisfies NextAuthConfig

这样你就可以知道bug到底在哪里

此外,您可以启用

NextAuth.debug
配置来获取有关应用程序中身份验证状态的更详细信息

export const {
    handlers: { GET, POST },
    auth,
    signIn,
    signOut,
} = NextAuth({

    debug: proccess.env.NODE_ENV === "development", // enable in dev - disable in production

    adapter: PrismaAdapter(db),
    session: { strategy: "jwt" },
    ...authConfig,
})
© www.soinside.com 2019 - 2024. All rights reserved.