简介

OAuth2 是一套授权机制,它使一个第三方应用程序(App)可以仅获取 http 服务的部分(受限)的访问权限。

传统的客户端-服务器授权模型非常简单,即客户端使用资源拥有者的证书去服务器访问对应的资源。为了让第三方App也可以访问到资源,资源的拥有者必须将证书共享给第三方应用程序,这就造成了以下一些问题:

  1. 第三方App需要去存储资源拥有者的证书——典型的比如账号及密码信息
  2. 服务端需要支持密码登录即校验——安全性低
  3. 第三方App的权限往往过大
  4. 资源拥有者不能只取消某个第三方App的资源访问权限
  5. 第三方App存储证书会有安全风险

OAuth 2 通过引入授权层,分离客户端和资源拥有者,来解决这些问题。

在 OAuth 中,客户端通过访问授权服务器来获取资源,而不是直接访问资源拥有者的服务。客户端使用授权服务器提供的 access token 来访问受保护的资源。

access token 中包含了授权范围、生命周期、以及其他的访问权限属性。

注:OAuth 2 被设计成仅和 HTTP 服务一起使用,任何在其他协议中使用都超过了其职责范围。

基础概念

  • resource owner - 资源拥有者
    • 一般来说是终端用户
  • resource server - 资源服务器
    • 保存资源拥有者资源的地方
  • client - 第三方客户端
    • 希望访问资源拥有者受保护资源的客户端
  • authorization server - 授权服务器
    • 验证 client 然后发布 access token

授权服务器 和 资源服务器可以是不同的服务;也可以是相同的服务。

**

  • access token
    • 用于访问资源拥有者被访问资源的证书
    • 一般包含过期时间和授予的权限范围
  • refresh token
    • 当 access token 过期时,被客户端用来获取新的 access token 而不用重新向用户发起授权流程

      常规协议流

      image.png

      想象一个 微信小程序的授权过程。

带 Refresh Token 的协议流

image.png

HTTP 重定向

该规范广泛使用了 http redirect,即客户端不需要知道所有服务器的地址,在授权服务器返回时,直接重定向到另一个地址。

参考链接

https://tools.ietf.org/html/rfc6749