• home > webfront > server > NestJS >

    nestjs基于Fastify平台,接入JWT用户登录认证避坑指北

    Author:zhoulujun Date:

    nestjs常用的passport是基于express 框架,

    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