如何使用 NestJS 集成 Passort 和 JWT Token 实现 HTTP 接口的权限管理

这篇具有很好参考价值的文章主要介绍了如何使用 NestJS 集成 Passort 和 JWT Token 实现 HTTP 接口的权限管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💡 如果你不希望其他人可以随意进出你的房子,那么你需要给你的房子上个锁。

前言

开发一个接口很容易,开发一个具有安全性的接口却不容易。成熟的后端服务项目最注重的一点就是如何保护系统的数据安全,不能让用户无脑的访问操作所有的数据,这是不合理更是极度危险的行为。

NestJS 作为企业级后端开发框架,自然会提供一套权限校验的方案,本文基于NestJS的passort方案,结合 jwt token 完成对系统服务的保护。

操作步骤

💡 给你的服务装上防盗锁,只允许有钥匙的人进入。

一、安装依赖库

首先需要在nestjs项目中安装特定的依赖库

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

二、引入 Passort 和 JWT 模块

身份认证是由passort模块提供主要框架,具体的校验能力我选择通过jwt完成用户信息验证,即引入jwt相关的nestjs模块;

import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secret: 'your-secret-key', // TODO: 你需要放入自己的密钥,或者从环境变量中提取
      signOptions: { expiresIn: '1d' }, // 这是可选的
    }),
  ],
  providers: [AuthService, JwtStrategy],
})
export class AuthModule {}

三、创建 JWT 策略

需要创建一个JWT策略,这个策略服务是用于处理JWT的校验与解析。

import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { Injectable, UnauthorizedException } from '@nestjs/common';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: 'your-secret-key', // TODO: Replace with your key
    });
  }

  async validate(payload: any) {
    // TODO: Add your validation logic
  }
}

四、Controller方法使用验证装饰器

当完成JWT策略创建并注入到AppModule模块,即可在服务接口上使用 AuthGurd 装饰器进行用户身份的验证。

import { Controller, Get, UseGuards, Request } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Controller()
export class AppController {
  constructor() {}

  @UseGuards(AuthGuard('jwt'))
  @Get()
  getHomeInfo() {
    return {
      code: 0,
      message: 'ok',
      data: {
        name: 'https://www.levenx.com',
      },
    };
  }
}

访问 http://localhost:3000

如何使用 NestJS 集成 Passort 和 JWT Token 实现 HTTP 接口的权限管理,NestJS 最佳实践手册,http,数据库,服务器,nest.js,passort,jwt

由此发现请求首先会经过JWT策略的身份验证,需要保证请求的header中包含 Authorization 字段。

五、生成 JWT Token

步骤五的截图中看到,当客户端没有做任何处理就发起请求时,直接被passport拦截并返回401。

为了通过身份验证拦截,客户端发起请求时需要在请求Header上携带 Authorization字段,并且value值必需满足 Bearer + jwt token 格式,具体实现可参考:

fetch('http://localhost:3000', {
  headers: {
    'Authorization': `Bearer ${jwtToken}`
  }
})

客户端如何获取到**jwt token**字符串?

从步骤二中,我们已经在AppModule引入了 JwtModule,它在全局提供了生成JWT Token的服务 JwtService,通过 JwtService即可生成JWT Token字符串。

import { JwtService } from '@nestjs/jwt';
import { Injectable } from '@nestjs/common';

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

  async sign() {
    return this.jwtService.sign({ userId: 123456 });
  }
}
@Controller()
export class AutoController {

  @Inject(AuthService)
  private readonly authService: AuthService;

  @Get('/login')
  async login() {
    const token = await this.authService.sign();
    return {
      code: 0,
      message: 'ok',
      data: {
        token,
      },
    };
  }

}

通过访问 http://localhost:3000/login获取JWT Token字符串

如何使用 NestJS 集成 Passort 和 JWT Token 实现 HTTP 接口的权限管理,NestJS 最佳实践手册,http,数据库,服务器,nest.js,passort,jwt

客户端获取到 Token 字符串后需要持久化保存起来,并且后续接口请求Header中携带上。如果JWT 是合法有效、在有效期内,通过了AuthGuard的校验,即可正常访问受保护的接口。如果JWT无效,AuthGuard会拦截请求,用户会收到401错误码。

总结

本文介绍了如何对请求进行信息校验,对于没有携带Token的请求进行防御性拦截,这保证了基础的保护作用。但是还存在其他更细致的权限问题没有解决,比如不同的用户对于资源有不同的操作权限(有的用户只能查看资源,有的用户可以修改删除资源),这类问题需要我们对每个用户的权限进行更加清晰的管理。

很快我会输出一篇关于NestJS如何细粒度的权限管理的实操教程,敬请关注。文章来源地址https://www.toymoban.com/news/detail-813585.html

到了这里,关于如何使用 NestJS 集成 Passort 和 JWT Token 实现 HTTP 接口的权限管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式环境集成JWT(Java Web Token)

    Token的引入:客户端向服务端请求数据时一般都会加入验证信息,比如客户端在请求的信息中携带用户名、密码,服务端会校验用户名和密码是否正确,校验通过响应该客户端请求。但是每次都携带用户名和密码无疑有些繁琐,而且也不安全,在这种背景下,Token便应运而生。

    2024年02月11日
    浏览(48)
  • 快速教你如何使用postman工具进行接口测试?(配置全局token、JWT可用)

    现在很多人都在使用前后端分离进行项目开发,那在后端开发过程中使用postman测试工具可快速便捷完成接口测试。但是在测试过程中,很多人发现因为JWT的鉴权,导致半个小时就需要更新一下token,让我们的测试变得复杂。 若是将token作为全局变量,每次都能够自动获取tok

    2024年02月15日
    浏览(49)
  • 在springBoot中使用JWT实现1.生成token,2.接收前端token进行身份认证,3.通过token获取对象信息

    第一步:引入依赖 第二步:创建工具类 在until包下创建TokenUntil类,用于生成token 利用id,和password作为参数生成token JWt为这个包下的对象 第三步:token使用 在向前端返回的数据对象中添加token属性  是serve层中调用工具类方法将生成的token放到返回的数据中 注意:这里获取到

    2024年02月04日
    浏览(68)
  • 3-2. SpringBoot项目集成【用户身份认证】实战 【实战核心篇】基于JWT生成和校验Token

    书接上文 技术选型篇,我们做了【用户身份认证】的技术选型说明,对基于 Session、Token、JWT 的方案进行了详细的对比分析,详细说明了它们都是什么和各自的优缺点!这些是实战的基础,还没看过的同学,建议先看上文。最终采用的是目前流行的 基于JWT的Token用户身份认证

    2023年04月08日
    浏览(51)
  • 3-1. SpringBoot项目集成【用户身份认证】实战 【技术选型篇】基于Session、Token、JWT怎么选?

    通过第二章2-2. SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包,我们实现了基于SpringBoot项目的 API接口开发 ,并实现 API结果统一封装、支持跨域请求 等等功能,接下来开始第三章,主要做用户身份认证,主要实现一套 统一鉴权的用户身份认证的机制 。 我已经提

    2024年01月22日
    浏览(55)
  • jwt的token如何刷新?

    Token 都有过期时间。那么问题来了,假设 Token 过期时间为15天,用户在第14天的时候,还可以免登录正常访问系统。但是到了第15天,用户的Token过期,于是用户需要重新登录系统。 HttpSession 的过期时间 比较优雅,默认为15分钟。如果用户连续使用系统,只要间隔时间不超过

    2024年02月01日
    浏览(59)
  • springboot整合jwt实现token,简明笔记

    JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证;应用场景如用户登录。 JWT详细讲解请见 github:https://github.com

    2024年02月10日
    浏览(53)
  • JWT详解、JJWT使用、token 令牌

    在正式讲解JWT之前,我们先重温一下用户身份认证相关的一些概念: 服务器当中记录每一次的登录信息,从而根据客户端发送的数据来判断登录过来的用户是否合法。 缺点: 每个用户登录信息都会保存到服务器的session中,随着用户的增多服务器的开销会明显增大; 由于s

    2024年01月21日
    浏览(73)
  • 【SpringBoot】1、SpringBoot整合JWT实现Token验证

    单点登录(Single Sign On), 简称为 SSO , 是目前比较流行的企业业务整合的解决方案之一. SSO的定义:在多个应用系统中, 用户只需要登录一次就可以访问所有相互信任的应用系统, 企业间需要相互授信 众所皆知, HTTP是 无状态的协议 , 这意味着 服务器无法确认用户的信息。 于是乎,

    2024年02月03日
    浏览(74)
  • SpringBoot(九)jwt + 拦截器实现token验证

        前面两篇文章的过滤器和拦截器,我们都提到过可以做诸如权限验证的事情。http/https是无状态的协议,当用户访问一个后端接口时,如何判断该用户有没有权限?当然,可以使用账号+密码去验证。但是,如果使用账号和密码,需要频繁访问数据库,很明显,会带来一些

    2024年02月04日
    浏览(81)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包