https://oauth.net/2/ 说:php
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.web
OAuth(开放受权)是一个开放标准,容许用户受权第三方网站访问他们存储在另外的服务提供者上的信息,而不须要将用户名和密码提供给第三方网站或分享他们数据的全部内容。浏览器
OAuth2.0 是在 OAuth 基础上的简化与优化,虽然不向下兼容,可是和OAuth 有着类似的理论。安全
指对某种资源拥有受权能力的实体,若是资源属于某我的的话,这个 RO 就是这我的的终端帐户。服务器
指某种资源的容器,RS 经过判断 Access Token 是否有效决定资源是否被受权访问。微信
指须要访问某个用户的受保护资源的客户端程序,既能够是个桌面程序,也能够是个浏览器,也能够是个后台服务。app
指颁发 Access Token 给客户端的服务,固然颁发以前要对 RO 进行认证而且由 RO 完成受权。ide
从上面的角色能够猜到,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 不会获得个人用户名密码,可是依然能够相信个人身份,而我也只须要记住本身的微信口令,就能够同时登陆 wepass一、wepass二、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提出了多种受权类型:
如受权码 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 的场景。
访问令牌就是为了访问资源用的,通常是字符串形式,里面标注了其范围(Scope)和寿命(Duration)。
续期令牌就是在当前的访问令牌到期时,为期续期使用的。续期令牌是个可选项,它会和访问令牌一块儿颁发给Client,只不过续期令牌指在 AS 上使用,不在 RS 上使用。
TLS = Transport Layer Security,若是使用了 TLS,咱们就要对其遵循的规范版本进行标注。目前最新的版本号为1.2,最普遍的版本号为1.0。
还有HP、IBM、Oracle等等等等,有头有脸有用户的大公司都有本身的 AS 和 RS。
下次再聊聊客户端的注册
原文请戳: http://www.tonglei.win/2016/10/25/IT学习/SSO/理解OAuth2.0协议-基础篇/ @tonglei.wn