jwt+nest.js,实现登录挤出功能

Posted coderlin_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jwt+nest.js,实现登录挤出功能相关的知识,希望对你有一定的参考价值。

什么是JWT

JWT的全称是JSON Web Token。
一个jwt由三部分构成:Header,payload,Signature(签名)。

  • Header部分主要规定了token的加密方式。如
alg: "xx", type: "JWT"
  • payload是token中包含的重要信息。
  • Signature,就是header的base64的值+payload的base64+密钥组成的

    HS256算法,左边就是生成的token。

JWT特点:

  • 防止CSRF,跨站请求伪造。
  • 适合移动应用
  • 无状态,编码数据

工作原理

  • 客户端login
  • 服务端验证通过,返回token
  • 以后客户端请求隐私的就必须携带在header携带token
  • 服务端验证通过后,才会返回data。

nest中使用jwt

很好的文章

使用nest.js搭建后端服务


  • 守卫在每个中间件之后执行,但在任何拦截器或管道之前执行。
  • 中间件在守卫之前执行。
    仅在调用路由处理程序之前调用中间件,可以访问响应对象,但没有路由处理程序的结果。它们基本上是快速中间件函数

nest.js基于express,他的中间件就是express的中间件,中间件的调用在所有请求前面执行,这里只能拿到请求前的内容,无法拿到处理之后的结果。

  • 过滤器一般用来进行异常处理。
    异常过滤器在路由处理程序和拦截器之后调用。它们是响应发出前最后做出更改的地方。


    全局异常处理可以捕获程序抛出的错误,并且通过特定的形式返回给客户端和打印出来。友好的处理错误

  • 拦截器一般用来统一返回的数据格式,拦截器的作用与控制器,提供程序,守卫等相同,这意味着它们可以通过构造函数注入依赖项。
    拦截器可以在调用路由处理程序之前访问请求,在处理程序之后访问响应。绑定拦截器跟守卫一样,可以部分绑定,也可以全局绑定。

拦截器可以在访问请求前,也可以访问请求后的响应体。

使用DTO和管道进行参数验证
  • 数据传输对象(DTO)(Data Transfer Object),是一种设计模式之间传输数据的软件应用系统。
  • 管道和拦截器有点像,都是在数据传输过程中的“关卡”,只不过各司其职。
  • 管道有两个类型:转换:管道将输入数据转换为所需的数据输出。验证:对输入数据进行验证,如果验证成功继续传递,验证失败则抛出异常;
验证管道

定义控制器

需要给body的类型

接着需要定义管道类

调用validate,获取声明的DTO类型,然后匹配参数,不正确就报错。

使用守卫实现RBAC 0


守卫返回true,处理这次响应。守卫返回false,忽略这次响应。

方法装饰器的顺序就从后往前,所以token验证需要放在下面。这样经过token验证之后,才会将user流给守卫使用。

这样即完成了简单的验证。

使用Redis完成登录挤出功能

配置Redis

实现Redis实例

在每次登录获取token的时候,将token存放到redis中。

这里token多了一个参数时间,用来判断是否被别人登录。
xi效果:


然后我们需要在守卫那里,判断token是否被修改,如果有人登录,那么存在redis的token将会变更。此时再请求,token就会不一致,就会报错。

再点击登录

token不一样了。

再用老token测试,

完成。

该文参考自Nest.js 从零到壹系列

以上是关于jwt+nest.js,实现登录挤出功能的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nest.JS 中使用多个 Secret 实现多个 JWT 策略

nest.js + typeORM:身份认证,事务管理

如何在没有守卫装饰器的情况下始终验证 JWT? (Nest.js + 护照)

Nest.js 与 AWS Cognito,如何访问用户属性

nest.js 中的环境变量在 jwt.strategy.ts 中不可见

[Next] Next.js+Nest.js实现GitHub第三方登录