nest通过装饰器获取jwt有效负载数据

最终效果

通过装饰器直接取到jwt中保存的数据

  @Get()
  findAll(@JwtPayload() jwtPayload, @JwtPayload('userId') userId) {
    console.log('>>>', jwtPayload);
    console.log('>>>', userId);
  }

原理说明(可以略过)

首先,看一下身份验证守卫代码

import {
  CanActivate,
  ExecutionContext,
  Injectable,
  UnauthorizedException,
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { jwtConstants } from './constants';
import { Request } from 'express';
import { IS_SKIP_AUTH } from './auto.decorator';
import { Reflector } from '@nestjs/core';

/**
 * 身份验证守卫
 * 验证接口中的jwt是否有效
 */

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(
    private jwtService: JwtService,
    private reflector: Reflector,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    // 验证端点是否存在装饰器 SkipAuth
    const isSkipAuth = this.reflector.getAllAndOverride<boolean>(IS_SKIP_AUTH, [
      context.getHandler(),
      context.getClass(),
    ]);
    if (isSkipAuth) {
      return true;
    }

    const request = context.switchToHttp().getRequest();
    const token = this.extractTokenFromHeader(request);
    if (!token) {
      throw new UnauthorizedException();
    }
    try {
      const payload = await this.jwtService.verifyAsync(token, {
        secret: jwtConstants.secret,
      });

      // 将有效负载挂载至request对象上
      request['jwtPayload'] = payload;
    } catch {
      throw new UnauthorizedException();
    }
    return true;
  }

  private extractTokenFromHeader(request: Request): string | undefined {
    const [type, token] = request.headers.authorization?.split(' ') ?? [];
    return type === 'Bearer' ? token : undefined;
  }
}

第46行,将解析完成后的payload挂载到request对象上 (我的代码是根据官网步骤来的,逻辑有差异的话自行修改)

那么,我们只需要取到request上的payload对象就行了

通过自定义装饰器实现

实现

export const JwtPayload = createParamDecorator(
  (data: string, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    const payload = request.jwtPayload;

    return data ? payload?.[data] : payload;
  },
);

验证 (controller控制器上)

  @Get()
  findAll(@JwtPayload() jwtPayload, @JwtPayload('userId') userId) {
    console.log('>>>', jwtPayload);		// 打印数据对象
    console.log('>>>', userId);  // 打印对象中的userId
  }

相关推荐

  1. nest通过装饰获取jwt有效负载数据

    2024-07-11 17:36:03       25 阅读
  2. .net core 获取Jwt身份信息

    2024-07-11 17:36:03       49 阅读
  3. HarmonyOS-@Watch装饰:状态变量更改通知

    2024-07-11 17:36:03       57 阅读
  4. 装饰 之accessor 装饰

    2024-07-11 17:36:03       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 17:36:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 17:36:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 17:36:03       58 阅读
  4. Python语言-面向对象

    2024-07-11 17:36:03       69 阅读

热门阅读

  1. 物联网设计竞赛_10_Jetson Nano中文转汉语语音

    2024-07-11 17:36:03       20 阅读
  2. C++中的设计模式

    2024-07-11 17:36:03       23 阅读
  3. 软考中项报名需要什么条件?全方位分析!

    2024-07-11 17:36:03       19 阅读
  4. vscode编辑keil工程 5. vscode 提交git一直卡着转圈圈

    2024-07-11 17:36:03       20 阅读
  5. Vue3 根据相对路径加载vue组件

    2024-07-11 17:36:03       28 阅读
  6. ps导入图片的方式

    2024-07-11 17:36:03       22 阅读
  7. rust way step 8

    2024-07-11 17:36:03       23 阅读
  8. MySQL sql_safe_updates参数

    2024-07-11 17:36:03       20 阅读
  9. 表单前端怎么跳转页面:深入探索与实践

    2024-07-11 17:36:03       18 阅读
  10. Mysql中触发器的使用示例

    2024-07-11 17:36:03       21 阅读