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日

相关文章

  • Windows下安装 node 的版本控制工具 nvm

    下面是详细讲解如何在 Windows 下安装 Node.js 版本控制工具 NVM 的完整攻略,包含两条示例说明。 1. 安装 Git NVM 需要使用 Git 来进行安装和版本控制,因此需要先安装 Git。可以在 Git官网 下载相应的安装包进行安装。 2. 下载并安装 NVM 在命令行终端输入以下命令下载 NVM: curl -o- https://ra…

    node js 2023年6月8日
    00
  • 浅谈Node 调试工具入门教程

    下面是详细讲解“浅谈Node 调试工具入门教程”的完整攻略。 浅谈Node 调试工具入门教程 什么是调试工具 调试工具是一种帮助开发者诊断和解决代码问题的工具。它们可以被用于各种编程语言和环境中。 Node 调试工具简介 Node.js其实自带了一个调试器,叫做Node.js调试器(Node.js Debugger),也可以使用其他的调试工具,例如: VS …

    node js 2023年6月8日
    00
  • WebSocket实现简单客服聊天系统

    下面是“WebSocket实现简单客服聊天系统”的攻略: 一、什么是WebSocket WebSocket 具有双向通信的能力,它能够在浏览器与服务器之间创建持久性的连接,实现实时通信,比如聊天室、在线游戏等。 二、实现 WebSocket 客服聊天系统的原理 客服聊天系统的流程如下: 客户端发送连接请求给服务器,建立 WebSocket 连接 服务器对连接…

    node js 2023年6月8日
    00
  • 原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)

    下面是关于“原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)”的完整攻略,包含以下几个部分: 关于原生JS封装ajax 原生JS可以使用XMLHttpRequest对象来发送http请求,通过该对象的open()和send()方法来实现。但是,为了方便和规范使用ajax,我们可以封装一个ajax函数。下面是一个基本的封装实现: f…

    node js 2023年6月8日
    00
  • 有效提高JavaScript执行效率的几点知识

    有效提高JavaScript执行效率的几点知识 JavaScript的执行效率对于web开发来说非常重要,因为它可以直接影响用户体验和页面加载速度。以下是几个可以帮助有效提高JavaScript执行效率的技巧: 使用事件委托 事件委托是指将事件处理程序绑定到父元素,以便在其子元素中处理它们。这意味着你可以使用单个事件监听器来处理多个元素上的事件,从而避免了每…

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

    Node.js中的url.resolve方法使用说明 什么是url.resolve方法? url.resolve(from, to) 方法接受两个参数,from 和 to,并返回通过将 to 解析在 from 上得到的绝对 URL。 使用方法 const url = require(‘url’); const myUrl = url.resolve(‘htt…

    node js 2023年6月8日
    00
  • 整理 node-sass 安装失败的原因及解决办法(小结)

    整理 node-sass 安装失败的原因及解决办法(小结) 问题描述 在使用npm安装node-sass时,可能会遇到以下错误: gyp ERR! configure error gyp ERR! stack Error: Can’t find Python executable "python", you can set the PYT…

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

    下面是详细讲解“node.js中的path.normalize方法使用说明”的完整攻略。 什么是path.normalize方法 在node.js中,path模块提供了一系列与路径相关的方法,其中之一就是normalize方法。normalize方法的作用是规范化一个路径,消除路径中的冗余部分并将其转换为标准格式。这在处理路径时非常有用,尤其是在跨平台开发时…

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