无法使用 Next Auth 通过 Google 实现登录

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

这是导出所有必需功能的授权功能。

export const {
  auth,
  signIn,
  signOut,
  handlers: { GET, POST },
} = NextAuth({
  ...authConfig,
  providers: [
    Credentials({
      // @ts-ignore
      async authorize(credentials) {
        const parsedCredentials = z
          .object({ email: z.string().email(), password: z.string().min(8) })
          .safeParse(credentials);

        if (parsedCredentials.success) {
          const { email, password } = parsedCredentials.data;
          const user = await getUser(email);
          if (!user) return null;

          const passwordsMatch = await bcrypt.compare(password, user.password);
          if (passwordsMatch) return user;
        }
        console.log("Invalid credentials");
        return null;
      },
    }),
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
  ],
});

使用了额外的身份验证配置 -

export const authConfig = {
  providers: [],
  adapter: PrismaAdapter(prisma),
  session: {
    strategy: "jwt",
  },
  pages: {
    signIn: "/sign-in",
  },
  callbacks: {
    authorized({ auth, request: { nextUrl } }) {
      const isLoggedIn = !!auth?.user;
      const isOnDashboard = nextUrl.pathname.startsWith("/dashboard");
      if (isOnDashboard) {
        if (isLoggedIn) return true;
        return false; // Redirect unauthenticated users to login page
      } else if (isLoggedIn) {
        return Response.redirect(new URL("/dashboard", nextUrl));
      }
      return true;
    },
  },
} satisfies NextAuthConfig;

我的 Prisma 架构如下 -

model User {
  id       Int    @id @default(autoincrement())
  name     String
  email    String @unique
  password String
}

现在使用帐户登录,我将重定向到此页面 - http://localhost:3000/api/auth/error?error=CallbackRouteError 在终端中我收到此错误 -

[auth][error][AdapterError]: Read more at https://errors.authjs.dev#adaptererror
[auth][cause]: TypeError: Cannot read properties of undefined (reading 'findUnique')
    at getUserByAccount (webpack-internal:///(rsc)/./node_modules/@auth/prisma-adapter/index.js:220:45)
    at acc.<computed> (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/init.js:157:30)
    at Module.callback (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/routes/callback.js:58:45)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async AuthInternal (webpack-internal:///(rsc)/./node_modules/@auth/core/lib/index.js:104:38)
    at async Auth (webpack-internal:///(rsc)/./node_modules/@auth/core/index.js:121:30)
    at async D:\web-app\node_modules\next\dist\compiled\next-server\app-route.runtime.dev.js:6:62591
[auth][details]: {
  "provider": "google"
}

该错误与 prisma 适配器有一定关系。如何解决这个问题请帮忙。

next.js oauth prisma next-auth
1个回答
0
投票

您的提供商似乎在

getUserByAccounnt
上失败了。它试图从数据库中不存在的表中获取数据。为了在 NextAuth 中将 OAuth 提供程序与 Prisma 适配器结合使用,您需要使用 NextAuth 提供的架构。您可以在这里找到它。您可以更新架构,或者完全删除 Prisma 适配器并仅依赖 JWT。

© www.soinside.com 2019 - 2024. All rights reserved.