https://datatracker.ietf.org/doc/html/rfc6749 https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2 https://time.geekbang.org/column/article/259675?cid=100053901 OAuth 2实战.pdf

1. 什么是OAuth

摘自RFC6749 Abstract

The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849.

OAuth 实际上是 Open Authorization的缩写
它是一个标准设计
是 第三方 用来 在用户同意的情况下代表用户, 访问用户的资源的一种方式

  • 2012年的时候 OAuth2取代了OAuth1
  • OAuth2 现在是 网络应用授权设计 事实上的工业标准
  • OAuth2是专门为Http协议设计的

这段说了跟什么没说一样

2. OAuth2达到了什么目的

网络应用通过OAuth2的设计, 可以允许第三方在用户的临时允许之下, 有限的获取用户的资源

2.1 举个例子

在解释各种专有名词之前, 看个例子

用通俗的说法举个例子:
县里给姚明(Resource Owner)发补贴(Protected Resource),
姚明有事脱不开身, 希望奥尼尔(Client)去帮忙拿一下补贴
奥尼尔跟姚明说, 县里哪认得我啊, 肯定不会给我的, 你得帮我解决(Authorization Request)
于是奥尼尔领着姚明, 跑到了村委会(Authorization Server) ,
姚明在居委会跟工作人员说奥尼尔是帮他领补贴的(Authorization Grant)
让村委会开了个证明介绍信(Access Token) , 这个介绍信上写了去领补贴的(Scope)
最后奥尼尔拿着介绍信跑到了县政府(Resource Server), 亮出介绍信, 拿到了姚明的补贴

实际上, 现实生活中我们在很多地方都使用了OAuth2, 仔细想想, 我们通过微信登录各种应用, 是不是各种应用通过我们的授权获取了微信的用户名和头像?

2.2 名词解释

经过上面的例子, 我们有了比较感性的体会, 我们就可以给一些概念下定义了

2.2.1 角色

具体的定义在这: https://datatracker.ietf.org/doc/html/rfc6749#section-1.1

先说一下OAuth2中规定的几个角色的名字

  • Resource Owner : 资源拥有者, 可以理解为用户; 对应姚明
  • Client : 客户端, 可以理解为第三方应用; 对应奥尼尔
  • Authorization Server : 授权服务; 对应村委会
  • Resource Server : 资源服务, 用户的资源就存在这; 对应县政府

2.2.2 Protected Resource

顾名思义 Resource Owner 的资源; 这个资源是保存在Resource Server上
Resource Server又通过 Authorization Server来校验谁能获取这个资源
在上面的例子中, Protected Resource就是县里给姚明发的补贴

OAuth2 从始至终都是在解决, 如何安全的让第三方获取用户资源

2.2.3 Authorization Request

Authorization Request是 Client 从 Resource Owner 获取权限的请求
这是个抽象的描述

2.2.4 Authorization Grant

https://datatracker.ietf.org/doc/html/rfc6749#section-1.3

Authorization Grant 是 Authorization Request 之后 Resource Owner 给予 Client 授权的过程

后面我们会讨论OAuth2的几种许可类型, 它们的授权过程都有一些区别

在上面的例子中 奥尼尔带着姚明去开介绍信的过程就是 Authorization Grant

  1. Authorization Code 授权码许可
  2. Implicit 隐式许可
  3. Resource Owner Password Credentials 资源拥有者凭据许可
  4. Client Credentials 客户端凭据许可


2.2.4 Access Token

https://datatracker.ietf.org/doc/html/rfc6749#section-1.4

Access Token就是 当Client需要访问Protected Resource的时候, 需要出示的凭据,令牌

在上面的例子中 Access Token 就是介绍信

  • 介绍信是有时效限制的, Access Token 也是
  • 介绍信是有权限限制的, 比如只能代领姚明的补贴, 不能领姚明的个人档案, Access Token也是, 这个被称为Scope

token的传递方式可以参考: https://datatracker.ietf.org/doc/html/rfc6750

2.2.4.1 Scope

参见: https://datatracker.ietf.org/doc/html/rfc6749#section-3.3

2.3 OAuth2 的核心抽象的交互流程

上面这个例子, 体现的是OAuth2的核心思路
Client获取授权的交互流程如下图:

image.png
交互步骤:

  1. 第三方应用向用户请求授权
  2. 用户提供许可
  3. 第三方应用拿着用户的许可向授权服务申请令牌
  4. 授权服务校验许可是否合法, 颁发令牌
  5. 第三方应用使用令牌查询使用受保护的资源
  6. 资源服务校验令牌后返回受保护的资源

后面会介绍 rfc6749 中介绍的具体OAuth2实现

3. 许可类型

  1. Authorization Code 授权码许可
  2. Implicit 隐式许可
  3. Resource Owner Password Credentials 资源拥有者凭据许可
  4. Client Credentials 客户端凭据许可

image.png
在对接 OAuth 2.0 的时候
先考虑授权码许可类型,
其次再结合现实生产环境来选择:

  • 如果第三方应用Client是官方出品,那么可以直接使用资源拥有者凭据许可;
  • 如果第三方应用Client就是只嵌入到浏览器端的应用且没有服务端,那就只能选择隐式许可;
  • 如果第三方应用Client获取的信息不属于任何一个第三方用户,那可以直接使用客户端凭据许可类型。