API网关的权限验证实践( 二 )


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

API网关的权限验证实践

文章插图
 
以上图为例,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结构简单,字节占用小 。不需要在服务端保存会话信息,易于应用的扩展 。
  1. Kong API网关的JWT令牌应用
下图是Kong认证的实际过程 。
API网关的权限验证实践

文章插图
 
如果配置中允许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上 。
API网关的权限验证实践

文章插图
 

API网关的权限验证实践

文章插图
 
请求的时候只要在HTTP Header带上“Content-Type:application/json”和“Authorization: Bearer 认证中心申请的JWT令牌”即可访问到所需的资源 。
  1. Spring Cloud Gateway的JTW令牌应用
Spring Cloud Gateway是Spring官方基于Spring 5.0、Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式 。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等 。
API网关的权限验证实践

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

文章插图
 
  1. JWT令牌应用实例
1、登录获取token


推荐阅读