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

67次阅读

共计 1500 个字符,预计需要花费 4 分钟才能阅读完成。

什么是 JWT?
JWT(Json Web Token)是一个开放的数据交换验证标准 rfc7519(https://tools.ietf.org/html/r…,一般用来做轻量级的 API 鉴权。由于许多 API 接口设计是遵循无状态的(比如 Restful),所以 JWT 是 Cookie Session 这一套机制的替代方案。
组成
JWT 由三部分组成头部 (header)、载荷(payload)、签名(signature)。头部定义类型和加密方式;载荷部分放不是很重要的数据;签名使用定义的加密方式加密 base64 后的 header 和 payload 和一段你自己的加密 key。最后的 token 由 base64(header).base64(payload).base64(signatrue) 组成。
使用方式
平时需要鉴权的接口需要传这个 token,可以 post 字段提交,但是一般建议放在 header 头中,因为 JWT 一般配合 https 使用,这样就万无一失。
为什么安全?
首先 token 是服务端签发,然后验证时是用同样加密方式把 header、payload 和 key 再加密遍 然后看是不是和签名一致 如果不一致就说明 token 是非法的 这里主要靠的是加密(比如 HS256)难以被攻破 至少目前吧 另外不得不说这里的加密对服务器来说是一个开销 这也是 JWT 的缺点
使用
我很早就听说过 JWT 但那时候还没用上 感觉近几年前后端分离思想加速了 JWT 的使用 MVC 前置到前端(VUE、REACT)后端只用提供 API API 强调无状态 自然而然使用了 JWT 这套方案
之前做小程序时 没有绝对使用 JWT 这套方案 我把它简化了下
最近开发的一套项目用的是 Laravel 做后端提供 API 服务,所以自然而然使用了 JWT,使用的扩展是 tymon/jwt-auth 关于这套扩展机制的具体使用可以参考这篇文章 写的很不错:https://laravel-china.org/art…
项目使用时的具体细节
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…

正文完
 0