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 有着相似的理论。
指对某种资源拥有授权能力的实体,如果资源属于某个人的话,这个 RO 就是这个人的终端账户。
指某种资源的容器,RS 通过判断 Access Token 是否有效决定资源是否被授权访问。
指需要访问某个用户的受保护资源的客户端程序,既可以是个桌面程序,也可以是个浏览器,也可以是个后台服务。
指颁发 Access Token 给客户端的服务,当然颁发之前要对 RO 进行认证并且由 RO 完成授权。
从上面的角色可以猜到,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 ---| |
+--------+ +---------------+
由于第三方应用(client)的多样性,OAuth2.0提出了多种授权类型:
访问令牌就是为了访问资源用的,一般是字符串形式,里面标注了其范围(Scope)和寿命(Duration)。
续期令牌就是在当前的访问令牌到期时,为期续期使用的。续期令牌是个可选项,它会和访问令牌一起颁发给Client,只不过续期令牌指在 AS 上使用,不在 RS 上使用。
TLS = Transport Layer Security,如果使用了 TLS,我们就要对其遵循的规范版本进行标注。目前最新的版本号为1.2,最广泛的版本号为1.0。
还有HP、IBM、Oracle等等等等,有头有脸有用户的大公司都有自己的 AS 和 RS。