Next12 中带有 Prisma 适配器的 NextAuth 凭证提供程序不执行任何操作

2024-03-31

我已经设置了我的Nextjs (Next12) with NextAuth 凭证提供者并使用棱镜适配器将用户会话保留在数据库中。

我跟着这个文档 https://next-auth.js.org/adapters/prisma来自 NextAuth 团队自己。但什么都没发生当我点击登录按钮后。

To Note

在那之前:-

  • 我确保首先尝试从数据库获取数据,它工作得很好。
  • 我也确实尝试过只使用正常的session: { jwt: true, maxAge: 30 * 24 * 60 * 60 }而不是立即使用Adapter。也工作得很好。

Question

现在我只想知道是否可以使用CredentialsProvider with Adapter at all?

下一个验证 API

以下是 2 个示例,其中一个有效,一个无效:/pages/api/auth/[...nextauth].js

  • working: 不使用adapter
import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';

export default async function auth(req, res) {
  return await NextAuth(req, res, {
    secret: process.env.SECRET,
    adapter: PrismaAdapter(prisma),
    session: {
      jwt: true,
      maxAge: 30 * 24 * 60 * 60, // 30 days
    }
    providers: [
      CredentialsProvider({
        async authorize(credentials) {
          const user = await prisma.user.findFirst({
            where: {
                email: credentials.email,
                password: credentials.password
            }
          });

          if (user !== null)
          {
              return user;
          }
          else {
            throw new Error('User does not exists. Please make sure you insert the correct email & password.')
          }
        }
      })
    ],
    callbacks: {
      redirect: async ({ url, baseUrl }) => {
        return baseUrl
      },
      jwt: async ({ token, user, account, profile, isNewUser }) => {
        if (typeof user !== typeof undefined) token.user = user;
  
        return token
      },
      session: async ({ session, user, token }) => {
        token?.user && (session.user = token.user)
  
        return session
      }
    }
  })
}
  • 不工作: using prisma adapter
import { PrismaAdapter } from "@next-auth/prisma-adapter";
import { PrismaClient } from '@prisma/client';
import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';
const prisma = new PrismaClient()

export default async function auth(req, res) {
  return await NextAuth(req, res, {
    secret: process.env.SECRET,
    adapter: PrismaAdapter(prisma),
    providers: [
      CredentialsProvider({
        async authorize(credentials) {
          const user = await prisma.user.findFirst({
            where: {
                email: credentials.email,
                password: credentials.password
            }
          });

          if (user !== null)
          {
              return user;
          }
          else {
            throw new Error('User does not exists. Please make sure you insert the correct email & password.')
          }
        }
      })
    ],
    callbacks: {
      redirect: async ({ url, baseUrl }) => {
        return baseUrl
      },
      jwt: async ({ token, user, account, profile, isNewUser }) => {
        if (typeof user !== typeof undefined) token.user = user;
  
        return token
      },
      session: async ({ session, user, token }) => {
        token?.user && (session.user = token.user)
  
        return session
      }
    }
  })
}

棱镜模式

这是当前的schema.prisma(这来自 NextAuth 文档本身):-

  • 我已经做了npx prisma migrate dev & npx prisma generate
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["referentialIntegrity"]
}

datasource db {
  provider             = "mysql"
  url                  = env("DATABASE_URL")
  // shadowDatabaseUrl    = env("SHADOW_URL")
  referentialIntegrity = "prisma"
}

model Account {
  id                 String  @id @default(cuid())
  userId             String
  type               String
  provider           String
  providerAccountId  String
  refresh_token      String?
  access_token       String?
  expires_at         Int?
  token_type         String?
  scope              String?
  id_token           String?
  session_state      String?
  oauth_token_secret String?
  oauth_token        String?

  user User @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([provider, providerAccountId])
}

model Session {
  id           String   @id @default(cuid())
  sessionToken String   @unique
  userId       String
  expires      DateTime
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model User {
  id            String    @id @default(cuid())
  name          String?
  email         String?   @unique
  password      String?
  emailVerified DateTime?
  image         String?
  accounts      Account[]
  sessions      Session[]
}

model VerificationToken {
  identifier String
  token      String   @unique
  expires    DateTime

  @@unique([identifier, token])
}

我刚刚发现CredentialsProvider from next-auth不会与adapter完全按照这个doc https://next-auth.js.org/providers/credentials。您可能会发现它不能或不建议使用的原因CredentialsProvider.

这是一个额外的link https://github.com/nextauthjs/next-auth/discussions/2248您可以在其中找到有关此问题的讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Next12 中带有 Prisma 适配器的 NextAuth 凭证提供程序不执行任何操作 的相关文章

  • Google 地图在某些浏览器上不被识别为矢量地图

    我已经构建并部署了一个 next js 应用程序 该应用程序在 react google maps api 的帮助下显示地图 此外 我使用 Google 地图 数据驱动 API 来创建显示邮政编码边界的要素图层 我已将其部署到 Vercel
  • FIREBASE 数据库 - 存储子节点的唯一密钥(Swift/IOS)

    我正在尝试存储生成的独特的钥匙当 childByAutoId 被调用时 理论上 它将有助于映射稍后需要在我的应用程序中发生的指定子项的更新或更改 我对 Firebase 的分层数据库相当陌生 如果下面描述的方法不正确 请随时提供替代方案 我
  • 如何在MySQL数据库中插入数据?

    我有一个 ASP NET 应用程序和一个 MySQL 数据库 我想编写一个类来插入 删除和显示数据库中的数据 我有到数据库的连接 但无法在数据库中插入数据 我的班级插入方法 public string CreateEntry string
  • 数据库设计 - 何时拆分表?

    有时创建一个单独的表会产生更多工作 我是否应该将其拆分 例如 在我的项目中 我有一张客户表 每个客户对每种产品都有自己的特殊价格 只有5种产品 未来不会计划更多产品 每个客户也有一周中公司向他交付产品的独特日子 当日期和产品价格是客户表中的
  • 我可以在构建过程中获取 Next.Js 来排除 .babelrc 吗?

    我不想在构建过程中包含 babelrc 因为 SWC 作为 Babel 的替代品被禁用 我只需要 babelrc 作为用于开发测试目的的插件 但 SWC 尚不支持 我被告知要检查关于忽略编译器选项的文档 https next js org
  • 环回:原子读取和更新

    有没有办法在环回中实现类似的东西 LOCK READ INCREMENT UNLOCK 我想将计数器保留为数据库值 每个键都是一个计数器 或一个设置 并且它们不应该同时访问我的多个请求 此外 这也应该适用于本地请求 无 RemoteHook
  • 非关系数据库设计[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解您使用过的设计策略非关系型 nosql 数据库 也就是说 不使用传统关系设计或 SQL 的 大多数是新的 数据存储类 例如
  • 数百个别名/同义词与数据库表的完全限定名称

    考虑到多个模式中的数百个数据库表 在创建存储过程和视图时 您是否建议使用别名 同义词或完全限定名称 给定一些 schema table 像这样 Orders OrderHeader Production LineThroughput Sal
  • 通过单击按钮将 Access 中的数据获取到 C# 中的文本框中

    我在 MS Access 中有一个表 其中包含 FoodID FoodName Price 在 C 中 我有三个文本框 txtId txtName txtPrice 和一个按钮 btnSearch 我的问题是 在 C 中 我只需在 txtI
  • 通过 JDBC 将“daterange”字段值插入 PostgreSQL 表

    我在 PostgreSQL 9 3 有一个表日期范围 http www postgresql org docs 9 3 static rangetypes html字段类型 我可以像使用 JDBC 的字符串一样选择此字段 但无法将其插入表中
  • 如何在hostinger中部署nextjs项目

    有谁知道如何在托管共享主机中部署 nextjs 项目 我被困在这里 托管提供商有 hpanel 而不是 cpanel 并且您没有任何安装 nodejs 的选项 我很失望 我才订阅一年 现在我不知道该怎么办 我试图将构建的文件夹 next在
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • Nextjs 无法在生产环境中的“.next”目录中找到有效的构建

    我正在 docker 中运行我的应用程序 但我的生产构建和启动脚本仅在 docker 环境中失败 虽然node env开发在docker环境下运行良好 这是我的脚本 无法进行生产构建并启动服务器 我正在使用nodemon和babel bui
  • Neo4j Desktop DB 无法启动,状态为“KILLED”

    运行 Neo4j Desktop 版本 1 0 15 尝试启动DB导致启动失败 数据库启动失败 DB database f8950fdd 6b5f 4fea 8c9f e8457ee1da9a v3 3 1 退出 状态为 已杀 检查日志 主
  • Scrapy - 持续从数据库中获取要爬取的url

    我想不断地从数据库中获取要爬行的网址 到目前为止 我成功地从基地获取了 url 但我希望我的蜘蛛继续从该基地读取 因为该表将由另一个线程填充 我有一个管道 一旦爬行 工作 就会从表中删除 url 换句话说 我想使用我的数据库作为队列 我尝试
  • 如何使用 next.js 导入带有空格的文件?

    我正在摆弄 next js 我有一个 CSV 文件 其中包含一些我想在表格中显示的数据 当我尝试导入 csv 时遇到一个奇怪的错误 static data csv 1 66 Module parse failed Unexpected to
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb

随机推荐