如何在mysql的api中使用bcrypt nest js log时比较密码

c2e8gylq  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(245)

我 如何 在 使用 bcrypt 登录 时 比较 密码 , 我 在 登录 时 面临 比较 密码 的 问题 。 从 该 选择 查询 中 , 我 可以 得到 匹配 的 mailid , 但 如何 得到 哈希 密码 ?
注意 : 我 没有 使用 typeorm ...
这 是 我 的 服务 代码 ,

import { ConflictException, Injectable } from '@nestjs/common';
import { SignInDto,SignUpDto } from '../dto';
import { execute } from '../mysql';
import * as bcrypt from 'bcrypt';
import { FORMERR } from 'dns';

@Injectable()
export class AuthService {

    // ------SignUp-------

  public async CREATE(Dto: SignUpDto): Promise<any> {
    const [account]:any = await execute(
      `
        SELECT 
            * 
        FROM  
            account 
        WHERE 
            email = ? AND 
            is_active = ? AND  
            is_deleted = ?  
            `,
      [Dto.email.toLowerCase(), 1, 0],
    );

    if (account) {
      throw new ConflictException('Account already exists on this email id.');
    }

    Dto.email = Dto.email.toLowerCase();
    Dto.password = await bcrypt.hash(Dto.password, 12);
    Dto.confirmPassword = await bcrypt.hash(Dto.confirmPassword, 12);

    const data = { ...Dto};

    return await execute(`INSERT INTO account SET ?`, [data]);
}

// -------SignIn---------

public async GET(Dto: SignInDto): Promise<any> {
    const [isExist]:any = await execute(
      `
        SELECT 
            * 
        FROM 
            account 
        WHERE 
            email = ? AND 
            is_active = ? AND 
            is_deleted = ?
        `,
      [Dto.email.toLowerCase(), 1, 0],
    );

   

*if (!isExist) {
        const compare=await bcrypt.compare()
      throw new ConflictException('Account does not exists.');
    }*

    return {
      id: isExist.id,
    };
  }
}

中 的 每 一 个
conroller.ts

import { Controller, Post, Body, HttpCode, HttpStatus, Res, Get, ParseIntPipe, Param } from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { SignUpDto, SignInDto } from '../dto';
import { Response } from 'express';
import { AuthService } from './auth.service';

@Controller('auth')
export class AuthController {
    constructor(private readonly _authService: AuthService) { }

    @Post('/sign-up')
    @HttpCode(HttpStatus.OK)
    @ApiResponse({ status: HttpStatus.OK, description: 'Success' })
    @ApiOperation({ summary: 'SignUp' })
    public async SIGNUP(@Res() res: Response, @Body() Dto: SignUpDto): Promise<any> {
        const result: any = await this._authService.CREATE(Dto);
        if (result) {
            return res.status(HttpStatus.OK).json({ status: HttpStatus.OK, message: `Registration completed successfully.` });
        }
        return res.status(HttpStatus.BAD_REQUEST).json({ status: HttpStatus.BAD_REQUEST, message: `Something went wrong. Please try again later.` });
    }

    @Post('/sign-in')
    @HttpCode(HttpStatus.OK)
    @ApiResponse({ status: HttpStatus.OK, description: 'Success.' })
    @ApiOperation({ summary: 'SignIn' })
    public async SIGNIN(@Res() res: Response, @Body() Dto: SignInDto): Promise<any> {
        const result: any = await this._authService.GET(Dto);
        if (result) {
            res.status(HttpStatus.OK).json({ status: HttpStatus.OK, data: result, message: `Successfull` });
        }
    }
}

格式
我 在 登录 时 遇到 了 比较 密码 的 问题 。 从 该 选择 查询 我 可以 得到 匹配 的 mailid , 但 如何 得到 哈希 密码 ?
谢谢 ... ..

k3bvogb1

k3bvogb11#

首先,不需要保存哈希确认密码,只需检查确认密码是否与密码匹配,以确保用户发送的是他们期望的密码。
其次,假设有一个password列,您应该能够通过isExist.password获得密码。然后您可以通过bcrypt.compare(Dto.password, isExist.password)使用bcrypt检查密码是否相同。Bcrypt将负责根据散列密码计算相同的salt(实际上它是散列的一部分)如果传递的密码散列到相同的散列值,compare方法将返回一个布尔值,这样你就可以判断它是否正确。

相关问题