基于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
HMACSHA256(  base64UrlEncode(header) + "." +  base64UrlEncode(payload),  secret)

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也一样。

如何保证token的合法性?

签名和公钥私钥认证的区别