OAuth 2.0 的授权设计

906

简介

OAuth 2.0 是用于授权的行业标准协议,用来授权第三方应用,获取用户数据。该协议规范及其扩展正在 IETF OAuth工作组内开发。

OAuth 代表开放授权,把应用的私有数据安全得开放给指定的第三方应用。

术语

  • 资源拥有者(Resource Owner):资源所有者是授权应用程序访问其帐户的用户。应用程序对用户帐户的访问限于授权范围(Scope)(例如,读或写访问)。
  • 客户端(Client):客户端是尝试访问用户帐户的应用程序。在访问帐户之前,它需要获得用户的许可。客户端可以向用户显示登录页面已登录账户的授权页,以获取用于访问特定资源的访问令牌(access token)。
  • 授权服务器(Authorization Server):授权服务器验证用户凭据(credentials),并使用授权码(authorization code)将用户重定向回客户端。客户端与授权服务器进行通信以确认其身份,并将代码交换为访问令牌。
  • 资源服务器(Resource Server):资源服务器是用于访问受保护的资源的服务器。它处理来自具有访问令牌的应用程序的经过身份验证的请求。
  • 范围(Scope):指定应用程序从客户端请求的访问级别。
  • 同意(Consent)"同意"屏幕告诉您的用户谁正在请求访问其数据以及您要访问哪种数据。

在了解上面的术语之后,就可以进一步探讨 OAuth 的授权类型,各种授权的最终目的是获取访问令牌(access token)来获取资源。

五种不同的授权流程

  • 授权码授权(Authorization Code Grant)
  • 隐式授权(Implicit Grant)
  • 资源所有者证书授权(Resource Owner Credentials Grant)
  • 客户端证书授权(Client Credentials Grant)
  • 刷新令牌授权(Refresh Token Grant)

授权码授权

这种是较为完备的授权方式,在RFC-6749中,解释了它用于同时获取 访问令牌(access token)和刷新令牌(refresh token)。在访问令牌失效后,通过刷新令牌重新获取访问令牌

该模式整体流程:

  1. 客户端发起授权请求,用户允许授权客户端后,会拉起客户端应用或重定向到客户端网站,并且带上授权临时票据 code(授权码)参数;
  2. 通过 code 参数加上 client_id 和 client_secret 等,通过 API 换取 access_token;
  3. 通过 access_token 进行接口调用,获取用户基本数据资源或帮助用户实现基本操作;

他的授权流程如下:

oauth_1.svg

这里的客户端(Client)并非指的浏览器,指代基于浏览器的 web 应用,通常把一个 server 端(后台)作为代理和授权服务器进行授权认证。 关键参数解释:

  • client_idclient_secret: 由授权服务器生成,并且需要预先在授权服务器做备案。一旦生成基本保持固定值,通过它来确认客户端资质;
  • scope:确定授权范围;
  • state:用于保持请求和回调的状态,授权请求后原样带回给客户端。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议用户端(例如:浏览器)带上该参数,可设置为简单的随机数加 session 进行校验;
  • code:授权码(authorization code),用于获取 access_token 的临时凭证。为了安全起见,会有比较短的失效期只能使用一次的限制,时效时间通常设为几分钟。

client_id 定义为客户端标识(Client Identifier),授权服务器颁发给已注册客户端的唯一身份标识;它表示了客户端提供的身份信息并且无需加密;它暴露给资源拥有者,并且不允许单独被用于客户端授权。

隐式授权

故事:在此流程中,客户端直接获得 token,而无需执行额外的授权代码交换步骤,就能访问资源服务器上的资源。

他的授权流程如下: oauth_2.svg

这种方式省去了通过 code 交换 access token 的流程。

客户端证书授权

故事:客户端应用程序将其客户端凭据(客户端标识符和客户端密钥)提供给授权服务器,以请求批准访问资源服务器上的受保护资源(由客户端应用程序拥有)。授权服务器对客户端凭据进行身份验证并颁发 token。

它的流程如下:

oauth_3.svg

此流程中,客户端可以仅使用其客户端凭据(或其他受支持的身份验证方法)获取 token。

资源所有者证书授予

该授权需要资源所有者客户端具有信任关系下进行,启动此类型要格外小心,仅在其他流程不可行时才允许它。

客户端将要求用户提供其授权凭证(通常是用户名和密码),该流程如下:

oauth_4.svg

刷新令牌授权

令牌如果过期,没必要重新走流程,OAuth 允许直接刷新令牌即可获得有效令牌。

它的具体流程如下:

oauth_5.svg

遵循OAuth 2.0授权的应用

在这些授权类型中授权码授权的方式最为常用,像腾讯开放平台的授权登录、钉钉的免登流程、Github的授权登录等等。

扩展阅读:

> oauth.net/2/

> tools.ietf.org/html/rfc674…

> docs.github.com/en/develope…

> www.loginradius.com/blog/async/…

> www.ruanyifeng.com/blog/2019/0…

> developers.weixin.qq.com/doc/oplatfo…