OAuth2协议解读(二)

  目录:

  1. 简介

    在传统的客户端-服务器认证模型下,客户端利用资源拥有者的证书来通过服务器的认证,请求受限资源。为了使得第三方应用获取受限资源的权限,资源拥有者与第三方应用共享证书。但是这种方式带来下述的问题和限制:

      第三方应用需要存储资源拥有者的证书以备不时之需,通常是明文密码。

      尽管密码验证有它固有的弱点,但是服务器必须支持密码验证。

      第三方应用获得了过度宽泛的资源拥有者所享有的资源或资源的子集的权限,使得资源拥有者没有足够的能力去限制持续时间。

      资源拥有者要撤销某个第三方应用,就必须撤销所有的第三方应用的权限,而且要这么做,必须改变第三方的密码。

      对于任何第三方应用的妥协都会导致用户端密码和所有跟此密码相关的资源的妥协。

    OAuth通过引入一个认证层并且将客户端从资源拥有者分离出来,从而解决了上述问题。在OAuth框架中,客户端请求归属于资源拥有者的存储于服务器的资源,并且分发一个不同的证书集合。

    客户端通过获取一个接入码(一个字符串表明一个特定的范围,生存周期和其他的一些接入属性)来得到受限资源的权限,而不是通过运用用户的证书。接入码(access token)由一个认证服务器(资源拥有者授权)颁发给第三方应用,客户端就可以通过这个接入码来获得资源的权限。

    例如,一个用户可以授权一个打印服务获取它的受限图片(存储于一个图片分享服务器),而不用用户提供用户名和密码。相反的,它直接向一个图片分享服务器信任的认证服务器发起认证请求。认证通过之后,认证服务器会向打印服务颁发证书(access token)。

    1.1 角色

    OAuth定义了四个角色:

    资源拥有者

      一个可以控制受限资源的实体。如果比作人来看待,也称作终端用户。

    资源服务器(资源提供者)

      资源所存储的地方,可以响应对受限资源的请求(利用access token)。

    客户端

      客户端是一个替代资源拥有者向资源服务器请求资源的应用。术语“客户端”不同于普通意义上的服务器,桌面或其他设备上的应用程序。

    认证服务器 

      认证服务器在接受客户端发起的认证请求之后,给客户端分发接入码。

    至于认证服务器和资源服务器之间的交互,则不在本文讨论的范围之内。

    1.2 协议流程

       

      A 客户端请求资源拥有者的授权,授权的请求可以直接传送到资源拥有者,客户端也可以作为媒介,重定向用户到认证服务器。

      B 客户端收到认证授权,这个授权代表了资源拥有者对客户端的授权。

      C 客户端向认证服务器提供认证授权以获取接入码。

      D 认证服务器验证客户端的合法性,并且验证客户端提交的认证授权,如果验证通过,则颁发验证码。

      E 客户端携带接入码向资源服务器请求受限资源。

      F 资源服务器验证接入码成功后,响应客户端的请求。

    1.3 认证授权

      认证授权指的是一个证书,是客户端为了获取到接入码提供给认证服务器的一个凭证。一共有四种授权类型:授权码,implicit,资源拥有者的密码证书和客户端证书。并且还有可以定义新类型的可扩展机制。

      1.3.1 授权码

        授权码是将认证服务器作为一个客户端和资源拥有者之间的媒介而来。客户端不用直接向资源拥有者请求授权,而是将资源拥有者重定向到认证服务器,随后又将资源拥有者定向到客户端并且携带授权码。在将资源拥有者定向到客户端之前,认证服务器验证资源拥有者的合法性并获得授权。由于认证只发生在资源拥有者和认证服务器之间,所以客户端不能得到用户的证书。

        认证码只提供了很少但是很重要的几个安全益处,例如验证客户端的能力,例如传输接入码到客户端却不用经过资源拥有者的UA,也不用将接入码暴露给资源拥有者或者其他实体。

      1.3.2 隐含

        隐式授权是一个简单的认证流程,例如用js在浏览器上实现这个流程。这种方式下客户端直接发送接入码,而不是发送认证码。这种认证方式是隐式的,没有中间媒介(如认证码)。

        隐式授权情形下,认证服务器不能验证客户端的合法性。在某些情况下,客户端的身份可以通过重定向URI来验证,这个重定向的URI就是最初用来发送接入码的地址。这时接入码可能会暴露在资源拥有者和其他应用下。

        隐式授权提高了一些客户端的响应性和效率,因为它减少了获取接入码过程中的往返交互。

      1.3.3 资源拥有者的密码证书

        资源拥有者的证书指的就是用户名和密码,他们可以直接被用作授权码来请求接入码。这时的证书应该仅仅在资源拥有者和客户端之间有很高的信任度的情况下使用,并且其他的认证类型被禁用。

        即便这种认证类型下客户端直接使用用户的证书,这些证书也是用来单独请求接入码.这种授权方式可以不用存储用户的证书,同时也交换来了有效期更长的接入码和刷新码。

      1.3.4 客户端证书

        客户端证书可以作为认证授权码,此时的认证范围仅仅限于资源由客户端来控制,或者由之前的认证服务器授权的资源。客户端证书被作为认证授权过程,是因为客户端作为自身(客户端就是资源拥有者)来请求受限资源。

    1.4 接入码

      接入码是获取受限资源的证书,它是一个代表了客户端认证成功的字符串。这个字符串对客户端来说通常是不可见的。接入码代表了获取受限资源的特定范围和持续时间。接入码是由资源拥有者授权,资源服务器和认证服务器所保障的服务。

      

    1.5 刷新接入码

    1.6 TLS版本

    1.7 HTTP重定向

    1.8 协同

    1.9 符号约定

  2. 客户端注册

    2.1 客户端类型

    2.2 客户端标识符

    2.3 客户端认证

      2.3.1 客户端密码

      2.3.2 其他认证方式

    2.4 去注册

  3. 协议涉及端点

    3.1 认证端点

      3.1.1 响应类型

      3.1.2 重定向端点

    3.2 端点符号

      3.2.1 客户端认证

    3.3 接入码视角

  4. 获取认证过程

    4.1 授权认证码

      4.1.1 认证请求

      4.1.2 认证响应

      4.1.3 接入码请求

      4.1.4 接入码响应

    4.2 隐含授权

      4.2.1 认证请求

      4.2.2 接入码响应

    4.3 资源拥有者的密码证书授权

      4.3.1 认证请求和响应

      4.3.2 接入码请求

      4.3.3 接入码响应

    4.4 客户端证书授权

      4.4.1 认证请求和响应

      4.4.2 接入码请求

      4.4.3 接入码响应

    4.5 扩展授权

    5. 接入码的分发

      5.1 成功的响应

      5.2 错误响应码

    6. 刷新接入码

    7. 接入受限资源

      7.1 接入码类型

      7.2 错误响应

    8. 扩展性

      8.1 定义接入码类型

      8.2 定义新的端点参数

      8.3 定义新的认证授权类型

      8.4 定义新的认证授权响应类型

      8.5 定义附加的错误码

    9. 本地应用

    10. 安全讨论

    11. IANA讨论

    12. 参考

原文地址:https://www.cnblogs.com/bracken/p/2870326.html