NestJS 认证与授权:JWT、OAuth 和 RBAC 实现

从接口混乱到规范设计:RESTful API架构核心约束与工程实践详解 在构建现代网络服务时,API设计是连接客户端与服务端的核心桥梁。其设计理念遵循客户端-服务器分离、无状态、统一接口等架构约束,旨在实现系统的高内聚、低耦合与良好可伸缩性。从技术价值看,规范的API设计能显著提升开发效率、降低维护成本,并优化网络性能。在实际应用场景中,无论是Web应用、移动端后台还是微服务架构,清晰统一的接口契约都至关重要。本文以RESTful风格为例,深入剖析其六大约束原理,并结合**接口设计**与**HTTP方法**的正确使用,手把手演示如何构建易于理解、维护和扩展的Web API,帮助 阅读详情

在上一篇文章中,我们介绍了 NestJS 的数据库操作和 TypeORM 集成。本文将深入探讨如何在 NestJS 中实现完整的认证和授权系统。

JWT 认证实现

1. 安装依赖

npm install @nestjs/jwt @nestjs/passport passport passport-jwt bcrypt
npm install -D @types/passport-jwt @types/bcrypt

2. JWT 策略配置

// src/auth/strategies/jwt.strategy.ts
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private configService: ConfigService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: configService.get('JWT_SECRET'),
    });
  }

  async validate(payload: any) {
    return { 
      userId: payload.sub, 
      username: payload.username,
      roles: payload.roles 
    };
  }
}

// src/auth/auth.module.ts
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { JwtStrategy } from './strategies/jwt.strategy';
import { AuthService } from './auth.service';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.registerAsync({
      imports: [ConfigModule],
      useFactory: async (configService: ConfigService) => ({
        secret: configService.get('JWT_SECRET'),
        signOptions: { 
          expiresIn: '1d',
          issuer: 'nestjs-app'
        },
      }),
      inject: [ConfigService],
    }),
  ],
  providers: [AuthService, JwtStrategy],
  exports: [AuthService],
})
export class AuthModule {}

3. 认证服务实现

// src/auth/auth.service.ts
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { UsersService } from '../users/users.service';
import * as bcrypt from 'bcrypt';

@Injectable()
export class AuthService {
  constructor(
    private usersService: UsersService,
    private jwtService: JwtService,
  ) {}

  async validateUser(username: string, password: string): Promise<any> {
    const user = await this.usersService.findByUsername(username);
    if (user && await bcrypt.compare(password, user.password)) {
      const { password, ...result } = user;
      return result;
    }
    return null;
  }

  async login(user: any) {
    const payload = { 
      username: user.username, 
      sub: user.id,
      roles: user.roles 
    };

    return {
      access_token: this.jwtService.sign(payload),
      user: {
        id: user.id,
        username: user.username,
        email: user.email,
        roles: user.roles
      }
    };
  }

  async register(createUserDto: CreateUserDto) {
    // 检查用户是否已存在
    const existingUser = await this.usersService.findByUsername(
      createUserDto.username
    );
    if (existingUser) {
      throw new ConflictException('Username already exists');
    }

    // 加密密码
    const hashedPassword = await bcrypt.hash(createUserDto.password, 10);

    // 创建新用户
    const newUser = await this.usersService.create({
      ...createUserDto,
      password: hashedPassword,
    });

    // 返回用户信息和令牌
    const { password, ...result } = newUser;
    return this.login(result);
  }
}

4. 认证控制器

// src/auth/auth.controller.ts
import { Controller, Post, Body, UseGuards, Get } from '@nestjs/common';
import { AuthService } from './auth.service';
import { JwtAuthGuard } from './guards/jwt-auth.guard';
import { GetUser } from './decorators/get-user.decorator';

@Controller('auth')
export class AuthController {
  constructor(private authService: AuthService) {}

  @Post('login')
  async login(@Body() loginDto: LoginDto) {
    const user = await this.authService.validateUser(
      loginDto.username,
      loginDto.password
    );
    if (!user) {
      throw new UnauthorizedException('Invalid credentials');
    }
    return this.authService.login(user);
  }

  @Post('register')
  async register(@Body() createUserDto: CreateUserDto) {
    return this.authService.register(createUserDto);
  }

  @UseGuards(JwtAuthGuard)
  @Get('profile')
  getProfile(@GetUser() user: any) {
    return user;
  }
}

OAuth2.0 集成

1. Google OAuth2 实现

// src/auth/strategies/google.strategy.ts
import { PassportStrategy } from '@nestjs/passport';
import { Strategy, VerifyCallback } from 'passport-google-oauth20';
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
  constructor(private configService: ConfigService) {
    super({
      clientID: configService.get('GOOGLE_CLIENT_ID'),
      clientSecret: configService.get('GOOGLE_CLIENT_SECRET'),
      callbackURL: 'http://localhost:3000/auth/google/callback',
      scope: ['email', 'profile'],
    });
  }

  async validate(
    accessToken: string,
    refreshToken: string,
    profile: any,
    done: VerifyCallback,
  ): Promise<any> {
    const { name, emails, photos } = profile;
    const user = {
      email: emails[0].value,
      firstName: name.givenName,
      lastName: name.familyName,
      picture: photos[0].value,
      accessToken,
    };
    done(null, user);
  }
}

// src/auth/controllers/oauth.controller.ts
import { Controller, Get, UseGuards, Req } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Controller('auth/google')
export class OAuthController {
  @Get()
  @UseGuards(AuthGuard('google'))
  async googleAuth(@Req() req) {}

  @Get('callback')
  @UseGuards(AuthGuard('google'))
  async googleAuthRedirect(@Req() req) {
    // 处理 Google 认证回调
    return this.authService.googleLogin(req.user);
  }
}

2. GitHub OAuth2 实现

// src/auth/strategies/github.strategy.ts
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-github2';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class GithubStrategy extends PassportStrategy(Strategy, 'github') {
  constructor(private configService: ConfigService) {
    super({
      clientID: configService.get('GITHUB_CLIENT_ID'),
      clientSecret: configService.get('GITHUB_CLIENT_SECRET'),
      callbackURL: 'http://localhost:3000/auth/github/callback',
      scope: ['user:email'],
    });
  }

  async validate(
    accessToken: string,
    refreshToken: string,
    profile: any,
    done: Function,
  ) {
    const user = {
      githubId: profile.id,
      username: profile.username,
      email: profile.emails[0].value,
      accessToken,
    };
    done(null, user);
  }
}

RBAC 权限控制

1. 角色定义

// src/auth/enums/role.enum.ts
export enum Role {
  USER = 'user',
  ADMIN = 'admin',
  MODERATOR = 'moderator',
}

// src/auth/decorators/roles.decorator.ts
import { SetMetadata } from '@nestjs/common';
import { Role } from '../enums/role.enum';

export const ROLES_KEY = 'roles';
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);

2. 角色守卫

// src/auth/guards/roles.guard.ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Role } from '../enums/role.enum';
import { ROLES_KEY } from '../decorators/roles.decorator';

@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);

    if (!requiredRoles) {
      return true;
    }

    const { user } = context.switchToHttp().getRequest();
    return requiredRoles.some((role) => user.roles?.includes(role));
  }
}

3. 权限实体设计

// src/auth/entities/permission.entity.ts
import { Entity, Column, ManyToMany } from 'typeorm';
import { BaseEntity } from '../../common/entities/base.entity';
import { Role } from '../enums/role.enum';

@Entity('permissions')
export class Permission extends BaseEntity {
  @Column()
  name: string;

  @Column()
  description: string;

  @Column('simple-array')
  allowedRoles: Role[];
}

// src/users/entities/user.entity.ts
import { Entity, Column, ManyToMany, JoinTable } from 'typeorm';
import { Role } from '../../auth/enums/role.enum';
import { Permission } from '../../auth/entities/permission.entity';

@Entity('users')
export class User extends BaseEntity {
  // ... 其他字段

  @Column('simple-array')
  roles: Role[];

  @ManyToMany(() => Permission)
  @JoinTable({
    name: 'user_permissions',
    joinColumn: { name: 'user_id' },
    inverseJoinColumn: { name: 'permission_id' },
  })
  permissions: Permission[];
}

4. 权限检查服务

// src/auth/services/permission.service.ts
import { Injectable, ForbiddenException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Permission } from '../entities/permission.entity';
import { User } from '../../users/entities/user.entity';

@Injectable()
export class PermissionService {
  constructor(
    @InjectRepository(Permission)
    private permissionRepository: Repository<Permission>,
  ) {}

  async checkPermission(user: User, permissionName: string): Promise<boolean> {
    const permission = await this.permissionRepository.findOne({
      where: { name: permissionName },
    });

    if (!permission) {
      throw new ForbiddenException('Permission not found');
    }

    // 检查用户角色是否有权限
    return permission.allowedRoles.some(role => user.roles.includes(role));
  }

  async grantPermission(user: User, permissionName: string): Promise<void> {
    const permission = await this.permissionRepository.findOne({
      where: { name: permissionName },
    });

    if (!permission) {
      throw new ForbiddenException('Permission not found');
    }

    user.permissions = [...user.permissions, permission];
    await this.userRepository.save(user);
  }
}

5. 使用示例

// src/posts/posts.controller.ts
import { Controller, Post, Body, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { RolesGuard } from '../auth/guards/roles.guard';
import { Roles } from '../auth/decorators/roles.decorator';
import { Role } from '../auth/enums/role.enum';
import { GetUser } from '../auth/decorators/get-user.decorator';
import { User } from '../users/entities/user.entity';
import { PostsService } from './posts.service';
import { CreatePostDto } from './dto/create-post.dto';

@Controller('posts')
@UseGuards(JwtAuthGuard, RolesGuard)
export class PostsController {
  constructor(
    private postsService: PostsService,
    private permissionService: PermissionService,
  ) {}

  @Post()
  @Roles(Role.USER)
  async createPost(
    @GetUser() user: User,
    @Body() createPostDto: CreatePostDto,
  ) {
    // 检查用户是否有创建文章的权限
    const hasPermission = await this.permissionService.checkPermission(
      user,
      'create_post'
    );

    if (!hasPermission) {
      throw new ForbiddenException('You do not have permission to create posts');
    }

    return this.postsService.create(user, createPostDto);
  }

  @Post('publish')
  @Roles(Role.MODERATOR, Role.ADMIN)
  async publishPost(
    @GetUser() user: User,
    @Body('postId') postId: string,
  ) {
    return this.postsService.publish(user, postId);
  }
}

安全最佳实践

1. 密码加密

// src/common/utils/crypto.util.ts
import * as bcrypt from 'bcrypt';
import * as crypto from 'crypto';

export class CryptoUtil {
  static async hashPassword(password: string): Promise<string> {
    const salt = await bcrypt.genSalt(10);
    return bcrypt.hash(password, salt);
  }

  static async comparePasswords(
    password: string,
    hashedPassword: string,
  ): Promise<boolean> {
    return bcrypt.compare(password, hashedPassword);
  }

  static generateRandomToken(length: number = 32): string {
    return crypto.randomBytes(length).toString('hex');
  }
}

2. 请求限流

// src/common/guards/throttle.guard.ts
import { Injectable } from '@nestjs/common';
import { ThrottlerGuard } from '@nestjs/throttler';

@Injectable()
export class CustomThrottlerGuard extends ThrottlerGuard {
  protected getTracker(req: Record<string, any>): string {
    return req.ips.length ? req.ips[0] : req.ip;
  }
}

// src/app.module.ts
import { Module } from '@nestjs/common';
import { ThrottlerModule } from '@nestjs/throttler';

@Module({
  imports: [
    ThrottlerModule.forRoot({
      ttl: 60,
      limit: 10,
    }),
  ],
})
export class AppModule {}

3. 安全头部配置

// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as helmet from 'helmet';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // 安全头部
  app.use(helmet());

  // CORS 配置
  app.enableCors({
    origin: process.env.ALLOWED_ORIGINS.split(','),
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
    credentials: true,
  });

  await app.listen(3000);
}
bootstrap();

写在最后

本文详细介绍了 NestJS 中的认证与授权实现:

  1. JWT 认证的完整实现
  2. OAuth2.0 社交登录集成
  3. RBAC 权限控制系统
  4. 安全最佳实践

在下一篇文章中,我们将探讨 NestJS 的中间件与拦截器实现。

如果觉得这篇文章对你有帮助,别忘了点个赞 👍

如何在 NestJS 中实现 JWT 认证 NestJS 是 Node.js 的服务器端应用程序框架,可让您创建可扩展且高效的应用程序。它是用 TypeScript 编写的,并使用 Express.js 构建,这是一个轻量级的框架,它本身就很棒,但缺乏结构。Nest 支持面向对象编程、函数式编程和函数式反应式编程。如果你想在你的应用程序的后端有很多结构,这个框架是一个很好的选择。Nest 的语法和结构与前端框架 Angular 相似。它还使用 TypeScript、服务和依赖注入,就像 Angular 一样。 阅读详情

相关推荐

在 Nest.js 中使用 JWT 进行身份验证

最后,我们需要创建一个自定义的 JWT 守卫来实际执行身份验证逻辑。创建一个名为在上述代码中,我们创建了一个名为的类,继承自AuthGuard类,并使用'jwt'参数来指定使用 JWT 策略。然后,我们实现了方法来执行身份验证逻辑。现在,当你访问被保护的路由时,Nest.js 将自动执行 JWT 策略,并验证 JWT 的有效性。这就是在 Nest.js 中使用 JWT 策略进行身份验证的基本步骤。你可以根据自己的需求进行进一步的定制和扩展。希望这对你有帮助!Nestjs: nestjs学习仓库。

qq_53026081的博客 1727

nestjs使用jwt

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

lgldl的博客 5174

Ruflo:Claude的神经中枢与智能体蜂群操作系统

智能体(Agent)系统正从单模型调用迈向分布式协同范式,其核心挑战在于状态管理、跨会话记忆、安全联邦与共识决策。Ruflo 作为专为 Claude 深度优化的智能体操作系统,通过 CLI 驱动的 MCP 服务、HNSW 向量索引的 AgentDB 内存中枢、Raft 架构的 Swarm 协调器及零信任 Federation 协议,将复杂性封装为可复用的神经模式(SONA)与可信协作流。它不依赖用户理解 mTLS 或 HNSW 原理,而是以‘零认知负荷’方式暴露 Slash 命令接口,支撑真实工程场景中的

weixin_34242331的博客 544

nestjs使用jwt完成注册、登录、全局身份验证

最近也是在学习nestjs这一块的内容,也是看到nestjs安全这一块内容,顺便就使用jwt去实现了一下注册、登录、用户密码加密和对后端接口做一个统一的权限处理,注册登录功能大家都很熟悉,而接口权限统一处理,也就是咱们平时开发时,除了登录注册等一些公共接口以外的接口,需要对token进行一个验证,验证不通过则返回401,通过才去返回正确的状态码和数据。方法是对用户的密码和加密后的密码进行比较的,如果正确返回true,错误则返回fasle,第一个参数为登录时用户输入的密码,第二个为查出来的加密后的密码。

qq_53209510的博客 2711

前端与后端开发:从职责边界到技术栈的深度解析

在软件开发领域,前端与后端是构建现代应用的两大核心支柱。前端开发聚焦于用户界面与交互体验,负责将数据与业务逻辑以直观、流畅的方式呈现给用户,其技术栈围绕HTML、CSS、JavaScript及React、Vue等框架展开,核心挑战在于状态管理、性能优化与跨端兼容。后端开发则专注于服务器端的业务逻辑处理、数据存储与系统安全,确保服务的稳定、高效与可靠,涉及数据库设计、API构建、并发处理及微服务架构等技术。理解两者的根本区别——前端作为用户体验的塑造者,后端作为业务逻辑与数据的守护者——对于技术选型、团队协作

weixin_34037173的博客 301

nestjs-oauth2-server-module:适用于NestJS的OAuth2服务器

我们构建您的下一代软件! OAuth2服务器模块 该模块将您的转换为OAuth2服务器。 它基于 :用于实体和数据库模型 :用于命令和查询 :用于保护路线 安装 npm install --save @switchit/nestjs-oauth2-server # or yarn install @switchit/nestjs-oauth2-server 用法 实现UserValidatorInterface UserValidatorInterface允许您使用PasswordGrantStrategy验证用户。 在您的应用程序中查询它以验证给定的username和password与应用程序数据库中的用户匹配。 重要说明:当找不到用户时,您必须抛出InvalidUserException 。 import { Injectable } from "@nestjs/common

Hoppscotch开源API测试平台终极部署与架构解析

Hoppscotch是一款功能强大的开源API开发生态系统,为开发者提供完整的API测试、调试和文档化解决方案。作为Postman和Insomnia的优质替代品,它支持REST、GraphQL、WebSocket、MQTT等多种协议,提供离线使用、私有部署和跨平台体验。本文将从技术架构、部署方案、核心模块到生产运维,为您提供完整的Hoppscotch实施指南。 ## 项目价值定位:现代API开发

gitblog_01123的博客 342

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

f作者: 寒小阳 &&龙心尘 时间:2015年10月。 出处: 声明:版权所有,转载请注明出处,谢谢。手把手机器学习之逻辑回归应用——Kaggle泰坦尼克之灾1.引言先说一句,年末双十一什么的一来,真是非(mang)常(cheng)欢(gou)乐(le)!然后push自己抽出时间来写这篇blog的原因也非常简单: 写完前两篇逻辑回归的介绍和各个角度理解之后,小伙伴们纷纷表示『好像很高级的样纸,

寒小阳 43万+

Node.js后端开发架构演进与实战突破:从单体到微服务的完整技术路线深度解析

在当今快速迭代的技术生态中,Node.js后端开发正经历着从传统单体架构向云原生微服务的深刻转型。developer-roadmap-chinese项目提供的中文版后端开发路线图,为开发者揭示了这一演进路径中的关键技术节点和最佳实践选择。 ## 异步编程的演进:从回调地狱到现代化并发处理 Node.js的核心竞争力在于其非阻塞I/O模型,但随着应用复杂度的提升,异步编程模式经历了从回调地狱到现

gitblog_00368的博客 1109

手把手教你调试eDP接口:Main Link信号异常、AUXCH通信失败怎么办?

本文提供了一份详尽的eDP接口调试实战指南,重点解决Main Link信号异常与AUXCH通信失败两大核心难题。文章系统介绍了从工具准备、信号完整性分析(眼图、抖动测量)到AUXCH协议解码、HPD信号检查的完整排查流程,并分享了链路训练诊断与常见避坑技巧,帮助硬件工程师高效定位并解决显示问题。

Jerry的专栏 828

用AT7456E给监控摄像头加OSD?5步搞定时间水印和Logo叠加

本文详细解析了如何使用AT7456E视频字符叠加芯片为监控系统添加专业级OSD功能,涵盖硬件设计、字符库编程和系统集成等关键步骤。通过5步操作实现时间水印和Logo叠加,提升监控系统的可用性和专业性,特别适合安防和工业视觉应用。

sea99的博客 1012

Hoppscotch深度指南:构建现代API开发工作流的开源利器

在当今API驱动的开发环境中,一个高效、灵活的API测试工具已经成为开发者的必备武器。Hoppscotch作为一款开源的API开发生态系统,不仅提供了Postman的替代方案,更在功能集成、部署灵活性和用户体验方面展现了独特优势。 ## 为什么选择Hoppscotch:超越传统API测试工具的核心价值 Hoppscotch的设计理念基于现代开发工作流的需求,它不仅仅是一个API测试工具,而是一

gitblog_00717的博客 713

IEEE Access投稿全流程解析:从初次提交到最终接收的完整指南

本文详细解析了IEEE Access期刊从初次投稿到最终接收的全流程,包括ORCID注册、论文投稿七步法、回稿再投流程及最终版提交等关键步骤。特别强调了4-6周快速同行评审的特点,为研究者提供了一份实用的投稿指南,帮助高效完成IEEE Access期刊投稿。

weixin_29273849的博客 915

彻底搞懂前后端:从核心区别到技术栈与协作实战

在软件开发领域,理解前后端分离架构是构建现代Web应用的基础。其核心原理在于将应用逻辑划分为用户可直接交互的客户端(前端)和负责业务逻辑与数据处理的服务器端(后端)。这种分离带来了明确的技术分工与协作模式,其技术价值在于提升开发效率、增强系统可维护性,并允许团队采用最适合的技术栈进行专业化开发。在实际应用场景中,前端聚焦于利用HTML、CSS、JavaScript及React、Vue等框架构建响应式用户界面和交互逻辑;后端则专注于使用Java、Python、Node.js等语言,结合Spring Boot、

weixin_33911824的博客 456

TOD和PPS精确时间同步技术

授时

u010783226的专栏 1万+

UWB芯片DW3000之PDOA测向实现源码

本文详细介绍如何基于UWB芯片DW3000之PDOA测向的源码实现。

DT程序员的博客 2615

前端与后端开发全解析:从核心职责到技术栈与职业发展

在软件开发领域,前端与后端是构建现代应用的两大核心支柱。前端开发聚焦于用户界面与交互体验的实现,负责将设计转化为用户可直接感知和操作的网页或应用,其技术核心围绕HTML、CSS和JavaScript展开,并衍生出React、Vue等主流框架,以构建动态、响应式的单页面应用。后端开发则专注于业务逻辑、数据处理与系统服务,通过构建API接口、设计数据库和处理高并发请求,为前端提供稳定、安全的数据支持,其技术栈涵盖Java、Go、Python等多种语言及Spring Boot、Django等框架。理解前后端分离架

weixin_33919950的博客 474

001、专栏导论:为什么我们需要MLIR与算子中间表示

五年前,大家还在争论“TVM还是XLA”。现在回头看,TVM的Relay IR和XLA的HLO都是特定领域的IR,它们解决了各自的问题,但缺乏通用性。MLIR的出现,本质上是因为硬件异构化已经到了一个临界点——CPU、GPU、NPU、DSP、FPGA,每个硬件都有自己的指令集和内存层次,没有一个统一的IR能同时高效表达所有硬件的计算模式。MLIR的“方言+渐进式lowering”模式,恰好提供了这种灵活性。你可以为每个硬件定制一套方言,然后共享公共的lowering路径。

Jack010169的博客 488

Nest.js权限管理系统开发(八)jwt登录

虽然仅使用@nestjs/jwt就能实现身份验证的功能,但是使用passport能在更高层次上提供更多便利。Passport 拥有丰富的生态系统,实现了各种身份验证机制。虽然概念简单,但你可以选择的 Passport 策略集非常丰富且种类繁多。Passport 将这些不同的步骤抽象为一个标准模式,模块将这个模式封装并标准化为熟悉的 Nest 结构。

Mamong's blog 2309

APP签名验证全栈破解:Frida Hook绕过+算法逆向+Python一键调用(附可运行脚本)

做过APP逆向和爬虫的同学,肯定都被签名验证折磨过:改了一行代码重新打包,APP直接闪退;抓包看到接口有个sign参数,翻遍JS找不到加密逻辑;好不容易找到加密函数,一调用就崩溃。客户端APK签名校验服务端接口签名验证。前者防止你篡改APP,后者防止你伪造请求。很多人卡在第一步,改完APK就闪退,根本没机会碰接口。本文基于真实项目实战,分享一套通用的签名验证破解方案。从客户端APK签名校验的Frida Hook绕过,到服务端sign算法的逆向还原,最后用Python实现一键调用。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 964

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

学习nest.js中如何使用jwt进行身份验证,这一篇文章就够

jwt的应用

qq_63204040的博客 3011

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【NestJS】JWT 鉴权

[Passport](https://www.passportjs.org/) 是一个 NodeJS 鉴权库 JWT 认证的交互流程:浏览器发起请求,服务端对用户名和密码进行验证。如果身份验证通过,服务端会基于用户信息生成 token 字符串,并将其响应给浏览器。浏览器会将 token 字符串存储起来。往后的每次请求,浏览器都会以请求头的形式带上 token 字符串。服务端收到请求后,会解析 token 字符串。如果 token 验证通过,则正常返回数据,否则抛出错误。

Superman_H的博客 2136

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

nestjs守卫/全局守卫校验jwt

部分接口需要用户登录后才可以访问,用户登录后可以颁发 jwt_token 给前端,前端在调用需要鉴权的接口,需要在请求头添加 jwt_token,后端校验通过才能继续访问,否则返回403无权访问

不求甚解的博客 5417

NestJS实现JWT认证与多端互踢

将JwtAuthStrategy和JwtAuthGuard进行引入,注意顺序,因为JwtAuthGuard中存在JwtAuthStrategy的注入,所有JwtAuthStrategy必须在JwtAuthGuard之前。因为接下来要做的是定义全局守卫,会对所有路由都进行一个过滤,那么我们路由中比如登录、注册、验证码等等这些是不需要进行验证的,就有了一个获取元数据中是否存在。注:该文档目前只对jwt做处理,缺少登录其它校验、以及redis部分,后续更新。,如果存在,就直接返回true,不在进行拦截。

qq_37061571的博客 558

NestJS学习记录-JWT认证

使用NodeJS内置的加密模块crypto,使用 AES(高级加密系统)算法 CTR 加密方式。文档地址:NestJS 中文网Nest 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,使用 TypeScript 构建,并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式反应式编程)的元素。1、在.env.development配置文件中配置2、在项目中添加一个utils模块,并手动添加一个crypto.service.ts。

weixin_39179366的博客 1102

nestjs10.x使用jwt生成token

6. 验证token, 要在auth中新建auth.strategy.ts。5. 然后在auth.service.ts中, 生成token,返回给前端。其中在validate中,会返回已经解析好的用户id和名称。4 其中密钥我通过外部文件引入,也可以使用.env引入。3 在auth.module.ts配置jwt。2 可以使用命令新建auth鉴权文件夹。7. 然后通过路由验证下token。

deng_zhihao692817的专栏 681
上一篇: NestJS 数据库操作:TypeORM 集成与最佳实践
下一篇: NestJS 中间件与拦截器:请求处理流程详解
Ethan独立开发
博客等级 码龄2年 1072粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值