nestjs基于Fastify平台,接入JWT用户登录认证避坑指北
Author:zhoulujun Date:
NestJS接入JWT网上教程有很多,但是基本都是基于express的内核,比如:
NestJS接入JWT用户验证的完整实现指南 https://www.mulianju.com/2025/nestjs-integration-with-jwt-authentication/
NestJS 登录功能:基于 JWT 的身份验证 https://juejin.cn/post/7236593818594312229
但是,passport,是基于express 框架
具体参看:https://docs.nestjs.com/recipes/passport
所以问chatGPT或者DeepSeek ,就会出现 幻觉代码
ExtractJwt.fromAuthHeaderAsBearerToken
这个完全没意,所以需要自定义,改为
const auth = request.headers['authorization']; const token = auth?.split(' ')[1];
完整代码如下:
import { IS_PUBLIC_KEY } from "@modules/auth/decorators/public.decorator"; import { Injectable, CanActivate, ExecutionContext } from "@nestjs/common"; import { Reflector } from "@nestjs/core"; import { Observable } from "rxjs"; import { JwtService } from "@nestjs/jwt"; @Injectable() export class JwtAuthGuard implements CanActivate { constructor( private readonly reflector: Reflector, private readonly jwtService: JwtService, ) {} canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [ context.getHandler(), context.getClass(), ]); if (isPublic) { return true; // 如果是 @Public() 装饰的路由,直接放行 } const request = context.switchToHttp().getRequest(); const token = request.headers.authorization?.split(" ")[1]; if (!token) { return false; } try { const payload = this.jwtService.verify(token); request.user = payload; return true; } catch { return false; } } }
不过,对于大项目来说,我还是偏向session
需求场景 | Session 方案 | 纯 JWT 替代方案 |
---|---|---|
即时吊销令牌 | 维护会话黑名单 | 使用 tokenVersion 字段(推荐方案如上) |
记录用户活跃状态 | 更新会话最后活动时间 | 前端定期发送心跳请求更新 JWT |
多设备管理 | 为每个设备创建独立会话 | JWT 携带设备 ID,服务端维护设备白名单 |
敏感操作验证 | 二次密码校验存储于会话 | 短期有效的 OTP(一次性密码)令牌 |
转载本站文章《nestjs基于Fastify平台,接入JWT用户登录认证避坑指北》,
请注明出处:https://www.zhoulujun.cn/html/webfront/server/nestjs/9538.html