Nest 学习笔记:登录认证
认证机制
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 的有效性