Nest.js 授权验证的方法示例

让我来给您详细讲解关于 "Nest.js 授权验证的方法示例" 的完整攻略。

标准安装

首先,需要使用 npm 安装 nestjs 官方授权验证库:

npm i @nestjs/passport @nestjs/jwt passport-jwt

安装了该插件后,我们还需要为它配置启用策略和秘钥等信息。例如:

// auth.module.ts

import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from './jwt.strategy';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secret: 'SECRET_KEY',
      signOptions: { expiresIn: '86400s' },
    }),
  ],
  providers: [AuthService, JwtStrategy],
  controllers: [AuthController],
  exports: [PassportModule, JwtModule],
})
export class AuthModule {}

JwtModule.register() 中设置了秘钥以及过期时间。在 PassportModule.register() 指定了默认的策略为 jwt,并且在后续请求中将会自动执行策略。

然后,我们需要创建 JwtStrategy 文件并且声明为 PassportModule 的提供者供 AuthGuard 直接调用:

// jwt.strategy.ts

import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { JwtPayload } from './jwt-payload.interface';

@Module({
  providers: [JwtStrategy],
})
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: 'SECRET_KEY',
    });
  }

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

JwtStrategy 中,我们使用 passport-jwt 包来验证 JWT 令牌,并且提供了一个 validate() 方法来验证 JWT 的有效性。该方法会自动将JWT的payload属性返回,以便下一步处理该信息。

当Token 通过 jwt 策略被验证,系统会自动调用 validate() 方法,返回一个对象,其中包含用户的信息。

示例1:授权Token并验证用户信息

接下来,我们简单介绍一下如何在系统中授权Token并且验证用户信息。

首先,在 auth.service.ts 文件中,我们需要创建一个用于授权用户的方法 signIn()

// auth.service.ts

import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { UserService } from '../user/user.service';
import { User } from '../user/user.entity';

@Injectable()
export class AuthService {
  constructor(
    private readonly userService: UserService,
    private readonly jwtService: JwtService,
  ) {}

  async signIn(user: User) {
    const payload = { username: user.username, sub: user.userId };
    return {
      access_token: this.jwtService.sign(payload),
    };
  }

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

该方法会创建一个 JWT token 并且返回给用户。并且注意,我们需要在头部注入 Authorization:Bearer "access_token" 来启用授权策略并且默认为JWT策略。

接下来,创建一个 protected 的路由:

// cats.controller.ts

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { CatsService } from './cats.service';
import { Cat } from './cat.entity';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @UseGuards(AuthGuard('jwt'))
  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

在代码中,@UseGuards(AuthGuard('jwt')) 会验证请求头是否包含 JWT token,如果是则自动将 payload 属性返回给 JwtStrategy。在这种情况下,我们在请求中访问的每个路由都会首先执行 'jwt' 策略来验证其有效性。

示例2: 权限守卫

以上示例主要用于授权并且自动验证用户信息。下面,我们会介绍一下如何使用 Permissions 守卫来进行更复杂的 “角色身份验证” 实现身份验证。

// roles.guard.ts

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';

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

  canActivate(context: ExecutionContext): boolean {
    const roles = this.reflector.get<string[]>('roles', context.getHandler());
    if (!roles) {
      return true;
    }
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    const hasRole = () =>
      user.roles.some(role => roles.indexOf(role) !== -1);
    return user && user.roles && hasRole();
  }
}

在上面的代码中,我们首先从请求中获取 roles 参数,并检查 user.roles 中是否有相应的角色。如果存在且匹配成功,则返回 true

// cats.controller.ts

import { Controller, Get, UseGuards, SetMetadata } from '@nestjs/common';
import { RolesGuard } from '../roles/roles.guard';
import { Cat } from './cat.entity';
import { CatsService } from './cats.service';
import { Roles } from '../roles/roles.decorator';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @UseGuards(RolesGuard)
  @Roles('admin')
  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

在执行例子 2 时,我们在路由中使用了 @Roles('admin) 守卫。在守卫中,我们将user对象与角色名称进行比较。如果请求不包含admin权限,则返回403 Forbidden错误。

以上就是关于 Nest.js 授权验证的方法示例攻略的详细讲解,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nest.js 授权验证的方法示例 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 基于socket.io+express实现多房间聊天

    下面我将详细讲解如何基于 Socket.io 和 Express 实现多房间聊天。 1. 安装依赖 首先,我们需要安装所需的依赖,包括 Express 和 Socket.io。我们可以使用 npm 进行安装: npm install express socket.io –save 2. 初始化 Express 在安装完依赖之后,我们需要初始化 Expres…

    node js 2023年6月8日
    00
  • Node.js如何使用Diffie-Hellman密钥交换算法详解

    Node.js如何使用Diffie-Hellman密钥交换算法详解 简介 Diffie-Hellman密钥交换算法是一种非对称加密算法,用于在两个或多个参与方之间安全地传输秘密信息。该算法由Whitfield Diffie和Martin Hellman在1976年提出,是公钥加密的先驱算法之一。 在本文中,我们将讲解如何使用Node.js实现Diffie-H…

    node js 2023年6月8日
    00
  • 抛弃Nginx使用nodejs做反向代理服务器

    要抛弃Nginx使用Node.js做反向代理服务器,可以按照以下攻略进行操作: 1. 安装Node.js 在开始使用Node.js作为反向代理的服务前,你需要确保你的系统已经安装了Node.js。如果未安装,可以在Node.js的官方网站上下载并安装。 2. 编写反向代理服务 在Node.js中编写反向代理服务器,需要使用http-proxy模块。你可以在终…

    node js 2023年6月8日
    00
  • node.js express捕获全局异常的三种方法实例分析

    Node.js Express捕获全局异常的三种方法实例分析 在Node.js Express应用开发中,捕获全局异常肯定是一个必要的技能。那么,在Node.js Express中,我们有哪些方法可以捕获全局异常呢?接下来,我们将会详细讲解使用三种不同方法捕获全局异常的实例分析。 方法一:process.on(“uncaughtException”)函数 使…

    node js 2023年6月8日
    00
  • node里的filesystem模块文件读写操作详解

    Node.js中文件读写操作详解 在Node.js中,可以使用fs模块进行文件系统相关的操作,如文件读写、目录操作等。 读取文件 使用fs.readFile()方法可以读取文件的内容,该方法的参数为文件路径和回调函数,回调函数的参数包含了错误信息和文件内容。 示例1:读取文本文件 const fs = require(‘fs’); fs.readFile(‘…

    node js 2023年6月8日
    00
  • 基于jstree使用JSON数据组装成树

    下面我来详细讲解“基于jstree使用JSON数据组装成树”的完整攻略。 1. jstree简介 Jstree是一个基于jQuery的树形结构插件,可以方便地将数据组装成树形结构,并支持多种事件处理。它是开源的,使用非常广泛,功能强大,而且使用简单。 2. 安装jstree 在使用jstree之前需要先引入jstree的JS和CSS文件。可以通过CDN来引入…

    node js 2023年6月8日
    00
  • node.js中的fs.lstatSync方法使用说明

    来讲一下“node.js中的fs.lstatSync方法使用说明”的完整攻略。 简介 node.js中的fs模块提供了很多API用于文件系统操作,其中fs.lstatSync方法是以同步的方式检索文件或目录的基本信息的。lstatSync方法返回一个包含文件信息的对象,包括文件类型、大小、创建修改时间等等。 语法 const fs = require(‘fs…

    node js 2023年6月8日
    00
  • 使用 Node.js 做 Function Test实现方法

    下面我将详细讲解“使用 Node.js 做 Function Test实现方法”的完整攻略: 1. 什么是 Function Test 1.1 Function Test 是什么 Function Test (下称 FT)是指对系统中的函数或方法进行测试,主要是在单元测试的基础上,对函数在系统中的调用流程进行测试,以确保函数在不同场景下的正常运行、稳定性以及…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部