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 从零到壹系列

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderlin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值