什么是OAuth2.0?
OAuth 2.0 is the next evolution of the OAuth protocol which was originally created in late 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices. This specification is being developed within the IETF OAuth WG.
OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。
OAuth2.0 是在 OAuth 基础上的简化与优化,虽然不向下兼容,但是和OAuth 有着相似的理论。
OAuth2.0 的角色
资源所有者 resource owner (RO)
指对某种资源拥有授权能力的实体,如果资源属于某个人的话,这个 RO 就是这个人的终端账户。
资源服务器 resource server (RS)
指某种资源的容器,RS 通过判断 Access Token 是否有效决定资源是否被授权访问。
客户端 client (C)
指需要访问某个用户的受保护资源的客户端程序,既可以是个桌面程序,也可以是个浏览器,也可以是个后台服务。
认证服务端 authorization server (AS)
指颁发 Access Token 给客户端的服务,当然颁发之前要对 RO 进行认证并且由 RO 完成授权。
OAuth2.0 协议流程
从上面的角色可以猜到,OAuth2.0 认证发生在某个资源拥有者希望通过客户端访问其所有资源的时候。 例如:网站 wepass.vip 希望实现微信登录,并获取用户微信的头像,那这时候 wepass.vip 这个网站本身就可以看作是一个 Client,作为拥有微信的我,就是一个资源拥有者(RO),要获取的头像就是我的资源(其实用户名密码本身也属于资源),而 RS(存头像的那个服务器) 和 AS (给认证的那个服务器) 则全部是由腾讯开放平台提供。
所以,当我(RO)想在 wepass.vip (Client) 上看到我的头像(Resource)的时候,我会先访问 wepass.vip,然后 wepass.vip 发现我没登录,就求腾讯(AS)给我验身,然后我在腾讯的认证服务器(AS)上输入我的用户名口令(或者二维码、或者快捷登录),如果腾讯认可我(有时还需要认可Client),就会生成一个 Access Token,wepass.vip 再通过Access Token 去腾讯的资源服务器(RS)上要我的头像,然后再展示给我,这样就完成了一个 OAuth2.0 认证。
这样做的好处是:wepass.vip 不会得到我的用户名密码,但是依然可以相信我的身份,而我也只需要记住自己的微信口令,就可以同时登录 wepass1、wepass2、wepass3 ... 也就是实现了单点登录。
看图(纯手绘):
+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+
还有一些常见概念
许可类型 Authorization Grant
由于第三方应用(client)的多样性,OAuth2.0提出了多种授权类型:
-
如授权码 Authorization Code Grant
这种类型 AS 在完成 RO 的认证和授权后,给 Client 一个 Code, Client 带着 Code 再去换 AccessToken,再用 AccessToken 访问资源。
-
隐式授权 Implicit Grant
这种情况下,RO 认证并授权后,AS 会把 AccessToken 直接交给 Client,而不需要 Client 保存 Authorization Code,再去换取 Access Token。 这种场景适合于没有服务端的程序,也就是没有办法对 Authorization Code 进行保密的 Client 类型。
-
RO凭证授权 Resource Owner Password Credentials Grant
这是一种 RO 对 Client 高度可信的授权方式,RO 要把自己的凭证(用户名、密码)交给 Client,Client 直接拿去向 AS 请求 Access Token。
-
Client凭证授权 Client Credentials Grant
这种场景下 AS 只需要认证 Client,比较适合于待访问资源的安全级别不高或者资源只属于这个 Client 的场景。
访问令牌 Access Token
访问令牌就是为了访问资源用的,一般是字符串形式,里面标注了其范围(Scope)和寿命(Duration)。
续期令牌 Refresh Token
续期令牌就是在当前的访问令牌到期时,为期续期使用的。续期令牌是个可选项,它会和访问令牌一起颁发给Client,只不过续期令牌指在 AS 上使用,不在 RS 上使用。
传输层安全性版本 TLS Version
TLS = Transport Layer Security,如果使用了 TLS,我们就要对其遵循的规范版本进行标注。目前最新的版本号为1.2,最广泛的版本号为1.0。
谁在用 OAuth2.0?
还有HP、IBM、Oracle等等等等,有头有脸有用户的大公司都有自己的 AS 和 RS。
下次再聊聊客户端的注册
玩得开心!
原文请戳: http://www.tonglei.win/2016/10/25/IT学习/SSO/理解OAuth2.0协议-基础篇/ @tonglei.wn