名词解释
- Third-party application:第三方应用程序,又称为客户端
- HTTP service:HTTP 服务提供商
- Resource Owner:资源所有者,又称为用户
- User Agent:用户代理,一般为浏览器
- Authorization server:认证服务器,一般为服务提供商专门用来处理认证的服务器
- Resource server:资源服务器,一般为用户存放用户资源的服务器
OAuth 1.0
简单的结构图
- 网站向认证平台请求一个未授权的 Token,这个 Request Token Url 是前面说的第一个 Url。
- 跳转至用户授权页面,提示用户进行登录,并进行授权,返回获得已授权的 Token,用到的 User Authorization Url 是前面说的第二个 Url。
- 通过已授权的 Token,向认证平台请求 Access Token(数据令牌),用到的 Request Access Url 是前面说的第三个 Url,返回后到这步整个认证流程就结束了,最后一步,是通过数据令牌等参数,调用接口获取用户信息,不完全算认证的流程。
参数名 解释 Request Token Url 获取未授权的 Token 的 Url User Authorization Url 请求用户对 Token 进行授权的 Url Request Access Url 使用 Token 获取 Access Token 的 Url
OAuth 2.0
现在主要用到的 OAuth 认证方式,主要都是基于2.0版本,所以我主要讲解这个版本。[详细信息][1]
如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌。 客户端发出更新令牌的 HTTP 请求,包含以下参数:
参数名 | 解释 | 可选性 |
---|---|---|
Grant-type | 使用的授权模式,固定为“refreshtoken” | 必选 |
Refresh-token | 早前收到的更新令牌 | 必选 |
Scope | 申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致 | 可选 |
授权码模式
A.用户访问客户端,后者将前者导向认证服务器。 URI 中包含的参数:
参数名 | 解释 | 可选性 |
---|---|---|
response_type | 授权类型,固定为"code" | 必选 |
client_id | 客户端的 ID | 必选 |
redirect_uri | 重定向 URI | 可选 |
scope | 申请的权限范围 | 可选 |
state | 客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值 | 必选 |
B.用户选择是否给予客户端授权。 | ||
C.假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向 URI"(redirection URI),同时附上一个授权码。 | ||
URI 中包含的参数: | ||
参数名 | 解释 | 可选性 |
:—– | :—– | :—–: |
code | 授权码[2] | 必选 |
state | 如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数 | 必选 |
D.客户端收到授权码,附上早先的"重定向 URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。 | ||
URI中包含的参数: | ||
参数名 | 解释 | 可选性 |
:—– | :—– | :—–: |
grant_type | 授权模式,固定为"authorization_code" | 必选 |
code | 上一步获得的授权码 | 必选 |
redirect_uri | 重定向 URI,且必须与 A步骤 中的该参数值保持一致 | 必选 |
client_id | 客户端 ID | 必选 |
E.认证服务器核对了授权码和重定向 URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。 | ||
URI 中包含的参数: | ||
参数名 | 解释 | 可选性 |
:—– | :—– | :—–: |
access_token | 访问令牌 | 必选 |
token_type | 令牌类型,只能是 bearer/mac | 必选 |
expires_in | 过期时间(S),如果省略该参数,必须其他方式设置过期时间 | 可选 |
refresh_token | 更新令牌,用来获取下一次的访问令牌 | 可选 |
scope | 权限范围,如果与客户端申请的范围一致,此项可省略 | 可选 |
简化模式
A.客户端将用户导向认证服务器。 URI 中包含的参数:
参数名 | 解释 | 可选性 |
---|---|---|
response_type | 授权类型,固定为"token" | 必选 |
client_id | 客户端 ID | 必选 |
redirect_uri | 重定向 URI | 可选 |
scope | 权限范围 | 可选 |
state | 客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值 | 可选 |
B.用户决定是否给于客户端授权。 | ||
C.假设用户给予授权,认证服务器将用户导向客户端指定的"重定向 URI",并在 URI 的 Hash 部分包含了访问令牌。 | ||
URI 中包含的参数: | ||
参数名 | 解释 | 可选性 |
:—–: | :—– | :—–: |
access_token | 访问令牌 | 必选 |
token_type | 令牌类型,该值大小写不敏感 | 必选 |
expires_in | 过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间 | 可选 |
scope | 权限范围,如果与客户端申请的范围一致 | 可选 |
state | 如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数 | 可选 |
D.浏览器向资源服务器发出请求,其中不包括上一步收到的 Hash 值。 | ||
E.资源服务器返回一个网页,其中包含的代码可以获取 Hash 值中的令牌。 | ||
F.浏览器执行上一步获得的脚本,提取出令牌。 | ||
G.浏览器将令牌发给客户端。 |
密码模式
A.用户向客户端提供用户名和密码。 B.客户端将用户名和密码发给认证服务器,向后者请求令牌。 URI 中包含的参数:
参数名 | 解释 | 可选性 |
---|---|---|
grant_type | 授权类型,此处的值固定为"password" | 必选 |
username | 用户名 | 必选 |
password | 用户密码 | 必选 |
scope | 权限范围 | 可选 |
C.认证服务器确认无误后,向客户端提供访问令牌。 | ||
URI 中包含的参数: | ||
参数名 | 解释 | 可选性 |
:—– | :—– | :—–: |
access_token | 访问令牌 | 必选 |
token_type | 令牌类型,bearer/mac | 必选 |
expires_in | 过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间 | 可选 |
refresh_token | 更新令牌,用来获取下一次的访问令牌 | 可选 |
scope | 权限范围,如果与客户端申请的范围一致 | 可选 |
适用情况:用户对客户端高度信任,比如客户端是操作系统的一部分,或者由一个著名公司出品。而对于认证服务器,只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
客户端模式
A.客户端向认证服务器进行身份认证,并要求一个访问令牌。 URI 中包含的参数:
参数名 | 解释 | 可选性 |
---|---|---|
Grant-type | 授权类型,固定为"clientcredentials" | 必选 |
scope | 权限范围 | 可选 |
B.认证服务器确认无误后,向客户端提供访问令牌。 | ||
URI中包含的参数: | ||
参数名 | 解释 | 可选性 |
:—– | :—– | :—–: |
access_token | 访问令牌 | 必选 |
token_type | 令牌类型,bearer/mac类型 | 必选 |
expires_in | 过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间 | 可选 |
refresh_token | 更新令牌,用来获取下一次的访问令牌 | 可选 |
scope | 权限范围,如果与客户端申请的范围一致 | 可选 |
注意:客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于 OAuth 框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。 |