基于JWT的权限管理
JWT解决什么问题?
解决请求合法性问题
避免客户端伪造请求的情况。
因为token的生成,是在服务端进行的,带有服务端保存的secret信息,这个信息客户端是不知道的,因此可以通过token校验请求是否合法(这个合法指的是来自真实的当前登录用户,而不是A用户伪造请求访问B用户的数据)。
1、发送请求的人是否是你允许的人(你发放令牌的人)
2、内容是否被篡改(使用了header和playload计算签名)
解决第三方权限对接问题
比如在B项目中,需要用到A项目提供的接口,而A项目的接口是有权限校验机制的,就可以生成一个token给B项目进行使用。
常见的比如SSO(Single Sign On)单点登录,就可以通过JWT来实现。
名词解释
JWT
JWT(JSON Web Token)是一个轻量级的权限标准。
https://www.jianshu.com/p/99a458c62aa4
配置参数:https://github.com/auth0/node-jsonwebtoken
JWT生成的token分为三部分,以英文点号分割:
Base64Url(header).Base64Url(playload).HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload),secret)
头部(Header)
载荷(Playload)
签名(Signature)
1 | |
token
中文一般翻译为令牌,试想令牌通常都不会很大,只是一个身份标记的卡片而已,且token往往会在网络之间频繁传递,因此不应该在token里面存放太多信息。
token的格式类似这样:Authorization: Bearer
比如这是一个http请求中的token示例:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTg5Mjc4MTYsInR5cGUiOiJhY2Nlc3MiLCJwYXlsb2FkIjp7ImVtYWlsIjoiemhvdWNoYW5nanVAbXloZXhpbi5jb20ifSwiaWF0IjoxNTk4OTIwNjE2fQ.22oD0u1zoDl_ZJoN1am-flhshQ0rVG0h3j45-02k5xU
RBAC
技术要点
加密算法
常见问题
哪些数据适合/不适合放在token中传递?
有权限的资源信息
比如用户有权限的URI列表。
但是这部分数据,是否放在服务端session中更合适呢?token中只存放用户的ID信息,比如邮箱或者userid,以及过期信息,这样可以减小网络上的数据传输量。
注意需要考虑到权限更新的问题,即用户的权限如果有变更,需要用户主动执行退出操作,且用户退出时,要记得清空服务端的session信息。
应该封装一个服务端session的lib库,便于操作session。cookie也一样。