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 策略
如何在没有守卫装饰器的情况下始终验证 JWT? (Nest.js + 护照)
Nest.js 与 AWS Cognito,如何访问用户属性