Nest 学习笔记:登录认证

Nest
笔记
Node

认证机制

JWT (JSON Web Token) 和 Passport(安装 passport-jwt)

认证过程

用户注册:邮箱密码注册(密码进行加密,明文密码不存储在数据库里)

用户登录:邮箱密码登录

发放 Token:登录成功,生成一个 JWT,发送给用户

Token 验证:后续请求,用户需要再请求的 Authorization 头部携带这个 Token,系统将验证 Token 有效性,以确认用户的身份。

组件和逻辑

AuthService

validateUser():检查用户提供的邮箱和密码是否匹配数据库中的记录;

login():在用户登录成功后调用,生成包含用户信息的 JWT

import { JwtService } from "@nestjs/jwt";
export class AuthService {
	// ...
	async validateUser(email: string, pass: string): Promise<any> {
		const user = await this.usersService.findOneByEmail(email);
		// 比对加密后的密码
		if (user && (await bcrypt.compare(pass, user.password_hash))) {
			const { email, _id } = user;
			return { email, _id };
		}
		return null;
	}

	async login(user: User): Promise<LoginResponseDto> {
		const { email, _id } = user;
		const payload = { email, sub: _id.toString() };
		return {
			access_token: this.jwtService.sign(payload),
		};
	}
}

LocalStrategy & LocalAuthGuard

LocalAuthGuard:登录方法的守卫,使用 LocalStrategy 生成一个 JWT 并返回给用户(基于用户名和密码的验证,继承自 passport 策略)

JwtStrategy & JwtAuthGuard

JwtAuthGuard:验证登录后的方法的守卫,使用 JwtStrategy 验证 JWT 的有效性