下图为一个简单的JWT的解码出来的例子:

文章插图
以上图为例,JWT的数据结构一般是一个三段式的字符,以“.”隔开:xxxxx.yyyyy.zzzzz 。
JWT第一部分是Header头部分,它是一个描述JWT元数据的Json对象,通常如下所示 。alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256),typ属性表示令牌的类型,JWT令牌统一写为JWT 。最后,使用Base64 URL算法将上述JSON对象转换为字符串保存 。
【API网关的权限验证实践】JWT第二部分是Payload,也是一个Json对象,除了包含需要传递的数据,还有七个默认的字段供选择 。分别是,iss:发行人、exp:到期时间、sub:主题、aud:用户、nbf:在此之前不可用、iat:发布时间、jti:JWT ID用于标识该JWT 。也可以加上自定义字段 。需要注意的是,默认情况下JWT是未加密的,任何人都可以解读其内容,因此如果一些敏感信息不要存放在此,以防信息泄露 。JSON对象也使用Base64 URL算法转换为字符串保存 。
JWT第三部分是Signature签名 。是这样生成的,首先需要指定一个secret,该secret仅仅保存在服务器中,保证不能让其他用户知道 。然后使用Header指定的算法对Header和Payload进行计算,然后就得出一个签名哈希 。也就是Signature 。
那么Application Server如何进行验证呢?可以利用JWT前两段,用同一套哈希算法和同一个secret计算一个签名值,然后把计算出来的签名值和收到的JWT第三段比较,如果相同则认证通过 。
JWT的优点包括如下:JSON格式的通用性,所以JWT可以跨语言支持,比如JAVA、JavaScript、php、Node等等 。可以利用Payload存储一些非敏感的信息 。便于传输,JWT结构简单,字节占用小 。不需要在服务端保存会话信息,易于应用的扩展 。
- Kong API网关的JWT令牌应用

文章插图
如果配置中允许OPTIONS请求,并且请求的方法确实是OPTIONS,放行 。
如果配置中设置了匿名消费者,并且有凭证,放行 。这里是为了实现多重认证,通过配置匿名消费者来实现逻辑或的认证,此时必须有其他认证插件,当其他认证插件通过,jwt插件就不再验证,若不设置匿名,则既要jwt验证也要其他认证插件验证 。
先后从query params,request header中查找token(根据配置的变量),token的格式为\s*[Bb]earer\s+(.+),如果从query params找到就返回了,不会再根据request header找 。
如果没有找到token,或者token格式不对,并且不允许匿名,返回401 。
如果没有找到token,并且允许匿名,根据配置的匿名的id查询消费者,增加request header:X-Consumer-ID、X-Consumer-Username和X-Anonymous-Consumer=true,id是自动生成的,username是配置时填写的,设置这个消费者的凭证是nil,放行 。
如果找到token,且格式合法,jwt解码这个token,验证token的 claim,消费者,签名验证,过期验证,全部通过后,同匿名一样,增加步骤5中的request header,并且清除X-Anonymous-Consumer这个header 。
以下是Kong网关集成OAuth插件的例子,首先启用OAuth插件,然后在将插件添加到需要集成权限的Service上 。

文章插图

文章插图
请求的时候只要在HTTP Header带上“Content-Type:application/json”和“Authorization: Bearer 认证中心申请的JWT令牌”即可访问到所需的资源 。
- Spring Cloud Gateway的JTW令牌应用

文章插图
使用Gateway全局过滤器获取JWT Token后进行用户认证及鉴权 。下图为实现该过滤器的代码 。

文章插图
- JWT令牌应用实例
推荐阅读
- 一个合格的测试工程师需要具备哪些能力?
- 自媒体运营的“六大工具”操作更高效,收入扩大化
- 红茶玫瑰泡水的功效,玫瑰花蕾茶的正确泡法
- 崂山红茶多少度水冲泡,绿茶多少度的水
- 英德泡红茶视频,红茶交易平台
- 如何挑选新鲜的大虾
- 如何泡英式红茶,英式泡红茶最好
- 如何挑选甜菜叶
- 熟普和红茶的汤色,普洱茶的冲泡暗红红
- 如何鉴别木榧
