JWT 授权验证
根
JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。它是一种用于双方之间传递安全信息的表述性声明规范。
JWT作为一个开放的标准(RFC 7519),定义了一种简洁的、自包含的方法,从而使通信双方实现以JSON对象的形式安全的传递信息。
可以看出JWT并不是一种只能权限验证的工具,而是一种标准化的数据传输规范。
How to work?
- 客户端向授权服务系统发起请求,申请获取“令牌”
- 授权服务根据用户身份,生成一张专属的“令牌”,并将该“令牌”以JWT规范返回给客户端
- 客户端将获取到的“令牌”放到http请求的headers中后,向主服务器系统发起请求。主服务系统收到请求后会从headers中获取“令牌”,并从“令牌”中解析出该用户的身份权限,然后做相应的处理(同意或拒绝返回资源)
可以看出,JWT授权服务是可以脱离我们的主服务系统而作为一个独立系统存在的
What is token?
JWT字符串
定义: 通过JWT规则加密后生成的字符串,三部分组成:Header,Payload,Signature。将这三部分由‘.’ 连接而组成的一长串加密字符串就成为JWT字符串。
Header
有且仅有两个数据组成,一个是“alg”(加密规范)指定了该JWT字符串的加密规则,另一个是“typ”(JWT字符串类型)。
例如:
{
"alg": "HS256",
"typ": "JWT"
}
将这组JSON格式的数据通过Base64Url格式编码后,生成的字符串就是我们JWT字符串的第一部分。
Payload
由一组数据组成,它负责传输数据,我们可以添加一些已注册声明,比如“iss” (JWT字符串的颁发人名称),“exp” (该JWT字符串的过期时间),”sub” (身份),“aud” (受众),除了这些,我们还可以根据需要添自定义的需要传输数据,一般是发起请求的用户信息。例如:
{
“iss”:"RayPI",
"sub": "Client",
"name": "张三",
"uid": 1
}
将该JSON格式的数据通过Base64Url格式编码后,生成的字符串就是我们JWT字符串的第二部分。
Signature
数字签名,由4个因素同时决定:编码后的header字符串,编码后的payload字符串,之前在头部声明的加密算法,我们定义的密匙字符串(secret)。