Prisma ORM 中的哈希密码

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

创建模型对象时如何在 Prisma ORM 中正确且优雅地散列密码?

我的

prisma/schema.prisma
文件:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id          Int      @id @default(autoincrement())
  name        String   @db.VarChar(100)
  username    String   @db.VarChar(100) @unique
  password    String   @db.Char(60) //<-I want this field to be hashed when created
  email       String   @db.VarChar(100) @unique
  createdAt   DateTime @default(now()) @map("created_at")
  updatedAt   DateTime @updatedAt @map("updated_at")
  @@map("users")
}
node.js hash prisma
1个回答
0
投票

哈希和加密不一样。但是,您可能希望对密码进行哈希处理,以便可以将用户密码安全地存储在数据库中。

为此,您必须从 js 代码中对其进行哈希处理,然后必须将哈希值作为字符串发送,并且

password
字段将仅将哈希值保存为字符串。

您的

prisma/schema.prisma
文件不应包含密码字符限制。应该是这样的。

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model User {
  id          Int      @id @default(autoincrement())
  name        String   @db.VarChar(100)
  username    String   @db.VarChar(100) @unique
  password    String   // <- no password character limit
  email       String   @db.VarChar(100) @unique
  createdAt   DateTime @default(now()) @map("created_at")
  updatedAt   DateTime @updatedAt @map("updated_at")
  @@map("users")
}

从您的 JavaScript 代码中哈希密码您的密码。您可以使用Bcrypt

下面给出了一个普通 Nodejs 的示例。

const bcrypt = require('bcrypt');
const {PrismaClient} = require('@prisma/client');
const prisma = new PrismaClient();

const saltRounds = 10;
const passwordToHash = 'my_password_123'; 
// you can use password character limit here at the time of getting the data from user


// Hash password with bcrypt and save to db
bcrypt.hash(passwordToHash, saltRounds, function(_err, hash) {
    // check error here
    // Then save password in DB with prisma
    (async(){
        prisma.user.create({
            data: {
                //... (give all other user data here)
                password: hash
            }
        })
    })().catch( (prismaError) => {console.log(prismaError)} )

});

要检查用户是否有效,可以使用

bcrypt.compare
方法。

async function checkUser(username, password) {
    const user = await prisma.user.findUnique({
        where: {
            username
        }
    })

    const match = await bcrypt.compare(password, user.password);

    if(match) {
        //login
    }

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