我 如何 在 使用 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 , 但 如何 得到 哈希 密码 ?
谢谢 ... ..
1条答案
按热度按时间k3bvogb11#
首先,不需要保存哈希确认密码,只需检查确认密码是否与密码匹配,以确保用户发送的是他们期望的密码。
其次,假设有一个
password
列,您应该能够通过isExist.password
获得密码。然后您可以通过bcrypt.compare(Dto.password, isExist.password)
使用bcrypt检查密码是否相同。Bcrypt将负责根据散列密码计算相同的salt(实际上它是散列的一部分)如果传递的密码散列到相同的散列值,compare
方法将返回一个布尔值,这样你就可以判断它是否正确。