8.2 理解OAuth 2.0协议

协议OAuth是为了解决上述问题设计的一种标准方案,我们的讨论针对2.0版。与把用户名和密码直接给第三方应用不同,此协议采用了一种间接的方式来达到同样的目的。

如图8-3所示,这个协议包括三个部分,分别是第三方应用获取用户授权、第三方应用获取临时Token以及第三方应用存取资源。

图8-3 OAuth 2.0协议

这六步理解起来不容易,主要是因为安全协议的设计,需要考虑协议的易证明性,所以我们换一种方式来解释这个协议。

简单来说,这个协议其实就做了两件事情:在用户授权的情况下,第三方应用获取Token所表示的临时访问权限,然后第三方应用使用这个Token去获取资源。

如果用网盘的例子来说明,那就是用户授权网盘为相册创建临时Token,然后相册使用这个Token去网盘中获取用户的照片。

实际上OAuth 2.0各个变种的核心差别在于第一件事情,就是用户授权给资源服务器的方式。这个差别演化出图8-4中的四种情况。

图8-4 OAuth 2.0协议的四种变化

第一种,也是最简单的一种。适用于第三方应用本身就拥有被访问资源控制权限的情况。在这种情况下,第三方应用只需要用自己的用户名和密码登录资源服务器并申请临时Token即可。

第二种,用户在对第三方应用足够信任的情况下,直接把用户名和密码给第三方应用,第三方应用使用用户名和密码向资源服务器申请临时Token。

第三种,用户通过资源服务器提供的接口,登录资源服务器并授权让资源服务器为第三方应用发放Token。

第四种,完整实现OAuth 2.0协议,也是最安全的。第三方应用首先获取以验证码表示的用户授权,然后用此验证码向资源服务器换取临时Token,最后使用Token存取资源。

从上面的描述中我们可以看到,资源服务器实际上扮演了鉴权和资源管理两种角色,这两者分开实现的话,协议流程会变成图8-5这样。

图8-5 鉴权和资源服务器拆分