JWT是什么?JWT(JsonWebToken)是一个开放的数据交换验证标准rfc7519(https://tools.ietf.org/html/r...,一般用于轻量级的API认证。由于很多API接口设计是无状态的(比如asRestful),所以JWT是CookieSession机制的替代方案。JWT由三部分组成:header、payload、signature。header定义了类型和加密方式;payload部分不是很重要的数据;signature使用定义了加密方法对header和payload进行base64加密和一段自己的加密key,最终的token由base64(header).base64(payload).base64(signatrue)组成。通常需要认证的接口需要传递这个token,可以在post字段中提交,但是一般建议放在header中,因为JWT一般是配合https使用的,所以比较安全。为什么安全?首先由服务端签发token,然后在验证时使用相同的加密方法对header、payload、key再次加密,然后检查是否与签名一致。如果不是,则表示令牌是非法的。在这里,加密(例如HS256)是困难的。它已被破坏,至少目前是这样。另外,不得不说这里的加密对于服务端来说是一种开销,这也是JWT的短板。我很早就听说过JWT,但当时还没有用过。感觉这几年前后端分离的想法加速了。JWT前端使用MVC(VUE、REACT),后端只提供API。API强调无状态,自然使用JWT。以前做小程序的时候也没有绝对用过这个方案。我对其进行了简化并在最近进行了开发。一组项目使用Laravel作为后端提供API服务,自然而然使用了JWT,使用的扩展是tymon/jwt-auth。这个扩展机制的具体使用可以参考这篇文章,写的很好:https://laravel-china.org/art...具体项目使用JWT的三个时间概念JWT有三个时间概念:expirationtimegracetimerefreshtime上面文章说token过了过期时间就不能刷新了,其实是可以刷新的。我这里可以用(启用了黑名单机制和1min宽限期)但是过了刷新时间就不能刷新了。这是肯定的。Token刷新可以使用laravel中间件实现自动刷新。服务器判断过期了。但是在刷新时间内主动刷新一次,在Header中将新的token返回给客户端。记住我的功能。我感觉定义刷新时间(比如一个月)+token自动刷新机制就是一套不能激活的rememberme功能。DestroyingtheTokenDefaultJWT这个方案貌似不能主动淘汰用户,因为服务器不会保存token,只会验证。这与会话不同。但是我觉得可以用黑名单机制来判断中间件。如果令牌从黑名单中移除,令牌将被销毁,并返回认证失败。单点登录结合缓存(例如redis)来存储客户端ID是可能的。客户等多套用户权限机制在客户端和商户端有两套用户机制(不同的表)。可以在auth.php中定义两个guard,分别指定对应模型的登录逻辑。比如auth('userApi')auth('corpApi')可以得到不同的guardrefresh中间件可以共享,但是router中的middleware方法可以指定具体的中间件。为什么不同权限系统的刷新中间件可以共享?感觉jwt-auth实现了这个机制。在验证token的时候,它会根据子字段来判断我的base64decode。两个token的payload后,发现其中一个subs是1,另一个是2,如有问题请指正!本文首发于Rootrl博客https://rootrl.github.io/2018...
