这是导出所有必需功能的授权功能。
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 适配器有一定关系。如何解决这个问题请帮忙。
您的提供商似乎在
getUserByAccounnt
上失败了。它试图从数据库中不存在的表中获取数据。为了在 NextAuth 中将 OAuth 提供程序与 Prisma 适配器结合使用,您需要使用 NextAuth 提供的架构。您可以在这里找到它。您可以更新架构,或者完全删除 Prisma 适配器并仅依赖 JWT。