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
Authorization Grant 是 Authorization Request 之后 Resource Owner 给予 Client 授权的过程
后面我们会讨论OAuth2的几种许可类型, 它们的授权过程都有一些区别
在上面的例子中 奥尼尔带着姚明去开介绍信的过程就是 Authorization Grant
- Authorization Code 授权码许可
- Implicit 隐式许可
- Resource Owner Password Credentials 资源拥有者凭据许可
- Client Credentials 客户端凭据许可
2.2.4 Access Token
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获取授权的交互流程如下图:
交互步骤:
- 第三方应用向用户请求授权
- 用户提供许可
- 第三方应用拿着用户的许可向授权服务申请令牌
- 授权服务校验许可是否合法, 颁发令牌
- 第三方应用使用令牌查询使用受保护的资源
- 资源服务校验令牌后返回受保护的资源
后面会介绍 rfc6749 中介绍的具体OAuth2实现
3. 许可类型
- Authorization Code 授权码许可
- Implicit 隐式许可
- Resource Owner Password Credentials 资源拥有者凭据许可
- Client Credentials 客户端凭据许可
在对接 OAuth 2.0 的时候
先考虑授权码许可类型,
其次再结合现实生产环境来选择:
- 如果第三方应用Client是官方出品,那么可以直接使用资源拥有者凭据许可;
- 如果第三方应用Client就是只嵌入到浏览器端的应用且没有服务端,那就只能选择隐式许可;
- 如果第三方应用Client获取的信息不属于任何一个第三方用户,那可以直接使用客户端凭据许可类型。