百度技术架构师总结:微服务架构之访问安全( 二 )

  • 第二步:拿到访问令牌(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各类模式中的一种 。
  • 由于OAuth2.0目前最为常用 , 所以接下来我再来详细讲解一下OAuth2.0的原理和各类用法 。
    三、详解 OAuth2.0 的「 访问安全 」?
    OAuth2.0是一种访问授权协议框架 。它是基于Token令牌的授权方式 , 在不暴露用户密码的情况下 , 使 应用方 能够获取到用户数据的访问权限 。
    例如:你开发了一个视频网站 , 可以采用第三方微信登陆 , 那么只要用户在微信上对这个网站授权了 , 那这个网站就可以在无需用户密码的情况下获取用户在微信上的头像 。
    OAuth2.0 的流程如下图:
     
    百度技术架构师总结:微服务架构之访问安全

    文章插图
     
     
    OAuth2.0 里的主要名词有:
    • 资源服务器:用户数据/资源存放的地方 , 在微服务架构中 , 服务就是资源服务器 。在上面的例子中 , 微信头像存放的服务就是资源服务器 。
    • 资源拥有者:是指用户 , 资源的拥有人 。在上面的例子中某个微信头像的用户就是资源拥有者 。
    • 授权服务器:是一个用来验证用户身份并颁发令牌的服务器 。
    • 客户端应用:想要访问用户受保护资源的客户端/Web应用 。在上面的例子中的视频网站就是客户端应用 。
    • 访问令牌:Access Token , 授予对资源服务器的访问权限额度令牌 。
    • 刷新令牌:客户端应用用于获取新的 Access Token 的一种令牌 。
    • 客户凭证:用户的账号密码 , 用于在 授权服务器 进行验证用户身份的凭证 。
    OAuth2.0有四种授权模式 , 也就是四种获取令牌的方式:授权码、简化式、用户名密码、客户端凭证 。
     
    下面来分别讲解一下:
    1. 授权码(Authorization Code)
    2. 授权码模式是指:客户端应用先去申请一个授权码 , 然后再拿着这个授权码去获取令牌的模式 。这也是目前最为常用的一种模式 , 安全性比较高 , 适用于我们常用的前后端分离项目 。通过前端跳转的方式去访问 授权服务器 获取授权码 , 然后后端再用这个授权码访问 授权服务器 以获取 访问令牌 。

    百度技术架构师总结:微服务架构之访问安全

    文章插图
     
    1. 流程如上图 。
    2. 第一步 , 客户端的前端页面(图中UserAgent)将用户跳转到 授权服务器(Authorization Server)里进行授权 , 授权完成后 , 返回 授权码(Authorization Code)
    3. 第二步 , 客户端的后端服务(图中Client)携带授权码(Authorization Code)去访问 授权服务器 , 然后获得正式的 访问令牌(Access Token)
    4. 页面的前端和后端分别做不同的逻辑 , 前端接触不到Access Token , 保证了Access Token的安全性 。
    5. 简化式(Implicit)
    6. 简化模式是在项目是一个纯前端应用 , 在没有后端的情况下 , 采用的一种模式 。
    7. 因为这种方式令牌是直接存在前端的 , 所以非常不安全 , 因此令牌的有限期设置就不能太长 。

    8. 推荐阅读