关于JWT(Json Web Token)的思考及使用心得

什么是JWT?

JWT(Json Web Token)是一个开放的数据交换验证标准rfc7519(https://tools.ietf.org/html/r...,通常用来作轻量级的API鉴权。因为许多API接口设计是遵循无状态的(好比Restful),因此JWT是Cookie Session这一套机制的替代方案。php

组成

JWT由三部分组成头部(header)、载荷(payload)、签名(signature)。头部定义类型和加密方式;载荷部分放不是很重要的数据;签名使用定义的加密方式加密base64后的header和payload和一段你本身的加密key。最后的token由base64(header).base64(payload).base64(signatrue)组成。html

使用方式

平时须要鉴权的接口须要传这个token,能够post字段提交,可是通常建议放在header头中 ,由于JWT通常配合https使用,这样就万无一失。前端

为何安全?

首先token是服务端签发,而后验证时是用一样加密方式把header、payload和key再加密遍 而后看是否是和签名一致 若是不一致就说明token是非法的 这里主要靠的是加密(好比HS256)难以被攻破 至少目前吧 另外不得不说这里的加密对服务器来讲是一个开销 这也是JWT的缺点laravel

使用

我很早就据说过JWT 但那时候还没用上 感受近几年先后端分离思想加速了JWT的使用 MVC前置到前端(VUE、REACT)后端只用提供API API强调无状态 天然而然使用了JWT这套方案git

以前作小程序时 没有绝对使用JWT这套方案 我把它简化了下github

最近开发的一套项目用的是Laravel作后端提供API服务,因此天然而然使用了JWT,使用的扩展是tymon/jwt-auth 关于这套扩展机制的具体使用能够参考这篇文章 写的很不错:https://laravel-china.org/art...redis

项目使用时的具体细节

JWT三个时间概念

JWT有三个时间概念: 过时时间 宽限时间 刷新时间小程序

上面那文章说token过了过时时间是不可刷新的,但实际上是能够刷新的,我这边使用时能够(开启了黑名单机制和1min宽限时间) 可是过了刷新时间不能刷新这是确定的后端

token刷新

能够借用laravel的中间件实现自动刷新 服务端判断过时了可是在刷新时间内主动刷新一次 并把新的token在Header头中返回给客户端缓存

记住我功能

我感受定义刷新时间(好比一个月) + token自动刷新机制这一套就是记住我功能

不能主动销毁Token

默认JWT这套方案好像不能够主动剔除用户的,由于服务端不会存token,只是验证。这和session不同。 可是我感受能够借用黑名单机制 来判断 中间件中判断该token在剔除黑名单中就销毁token并返回鉴权失败

单点登陆

结合缓存好比redis存客户端标识是能够的

多套用户权限机制

好比客户端有用户端和商家端两套用户机制(不一样表),能够在auth.php定义两个guard 分别指定对应的model Login逻辑单独写 好比auth('userApi') auth('corpApi') 能够拿到不一样的guard 刷新中间件是能够共用的 不过router中的middleware方法能够指定具体的middleware

为何不一样权限体系的刷新中间件能够公用

感受是jwt-auth实现了这机制 验证token时会根据sub字段判断 我base64decode两个token的payload后发现sub一个是1 一个是2

若是有问题欢迎指正!

本文最先发布于Rootrl's blog https://rootrl.github.io/2018...

相关文章
相关标签/搜索