在微服务架构下,有以下三种方案可以选择,当然,用的最多的肯定还是OAuth模式。

网关鉴权模式(API Gateway)

服务自主鉴权模式

API Token模式(OAuth2.0)

下面分别来讲一下这三种模式:

网关鉴权模式(API Gateway)

java架构师指南:微服务如何实现「访问安全」

通过上图可见,因为在微服务的最前端一般会有一个API网关模块(API Gateway),所有的外部请求访问微服务集群时,都会首先通过这个API Gateway,所以我们可以在这个模块里部署auth逻辑,实现统一集中鉴权,鉴权通过后,再把请求转发给后端各个服务。

这种模式的优点就是,由API Gateway集中处理了鉴权的逻辑,使得后端各微服务节点自身逻辑就简单了,只需要关注业务逻辑,无需关注安全性事宜。

这个模式的问题就是,API Gateway适用于身份验证和简单的路径授权(基于URL的),对于复杂数据/角色的授权访问权限,通过API Gateway很难去灵活的控制,毕竟这些逻辑都是存在后端服务上的,并非存储在API Gateway里。

服务自主鉴权模式

java架构师指南:微服务如何实现「访问安全」

服务自主鉴权就是指不通过前端的API Gateway来控制,而是由后端的每一个微服务节点自己去鉴权。

它的优点就是可以由更为灵活的访问授权策略,并且相当于微服务节点完全无状态化了。同时还可以避免API Gateway 中 auth 模块的性能瓶颈。

缺点就是由于每一个微服务都自主鉴权,当一个请求要经过多个微服务节点时,会进行重复鉴权,增加了很多额外的性能开销。

API Token模式(OAuth2.0)

java架构师指南:微服务如何实现「访问安全」

如图,这是一种采用基于令牌Token的授权方式。在这个模式下,是由授权服务器(图中Authorization Server)、API网关(图中API Gateway)、内部的微服务节点几个模块组成。

流程如下:

第一步:客户端应用首先使用账号密码或者其它身份信息去访问授权服务器(Authorization Server)获取 访问令牌(Access Token)。

第二步:拿到访问令牌(Access Token)后带着它再去访问API网关(图中API Gateway),API Gateway自己是无法判断这个Access Token是否合法的,所以走第三步。

第三步:API Gateway去调用Authorization Server校验一下Access Token的合法性。

第四步:如果验证完Access Token是合法的,那API Gateway就将Access Token换成JWT令牌返回。

(注意:此处也可以不换成JWT而是直接返回原Access Token。但是换成JWT更好,因为Access Token是一串不可读无意义的字符串,每次验证Access Token是否合法都需要去访问Authorization Server才知道。但是JWT令牌是一个包含JOSN对象,有用户信息和其它数据的一个字符串,后面微服务节点拿到JWT之后,自己就可以做校验,减少了交互次数)。

第五步:API Gateway有了JWT之后,就将请求向后端微服务节点进行转发,同时会带上这个JWT。

第六步:微服务节点收到请求后,读取里面的JWT,然后通过加密算法验证这个JWT,验证通过后,就处理请求逻辑。

这里面就使用到了OAuth2.0的原理,不过这只是OAuth2.0各类模式中的一种。

推荐阅读:java架构师指南之架构师的工作流程

相关文章: