OAuth协议的一些总结

学习 OAuth 协议的一些基础知识。

名词解释

  1. Third-party application:第三方应用程序,又称为客户端
  2. HTTP service:HTTP 服务提供商
  3. Resource Owner:资源所有者,又称为用户
  4. User Agent:用户代理,一般为浏览器
  5. Authorization server:认证服务器,一般为服务提供商专门用来处理认证的服务器
  6. Resource server:资源服务器,一般为用户存放用户资源的服务器

OAuth 1.0

简单的结构图

OAuth1.0的交互图

  1. 网站向认证平台请求一个未授权的 Token,这个 Request Token Url 是前面说的第一个 Url。
  2. 跳转至用户授权页面,提示用户进行登录,并进行授权,返回获得已授权的 Token,用到的 User Authorization Url 是前面说的第二个 Url。
  3. 通过已授权的 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]

OAuth2.0的交互图

  • A.用户打开客户端以后,客户端要求用户给予授权
  • B.用户同意给予客户端授权。这里有4种模式: 授权码简化密码客户端
  • C.客户端使用上一步获得的授权,向认证服务器申请令牌
  • D.认证服务器对客户端进行认证后,发放令牌
  • E.客户端使用令牌向资源服务器申请获取资源
  • F.资源服务器确认令牌正确后,同意向客户端开放资源

如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌。 客户端发出更新令牌的 HTTP 请求,包含以下参数:

参数名 解释 可选性
Grant-type 使用的授权模式,固定为“refreshtoken” 必选
Refresh-token 早前收到的更新令牌 必选
Scope 申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致 可选

授权码模式

OAuth2.0的授权码模式

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 权限范围,如果与客户端申请的范围一致,此项可省略 可选

简化模式

OAuth2.0的简化模式

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.浏览器将令牌发给客户端。

密码模式

OAuth2.0的密码模式

A.用户向客户端提供用户名和密码。 B.客户端将用户名和密码发给认证服务器,向后者请求令牌。 URI 中包含的参数:

参数名 解释 可选性
grant_type 授权类型,此处的值固定为"password" 必选
username 用户名 必选
password 用户密码 必选
scope 权限范围 可选
C.认证服务器确认无误后,向客户端提供访问令牌。
URI 中包含的参数:
参数名 解释 可选性
:—– :—– :—–:
access_token 访问令牌 必选
token_type 令牌类型,bearer/mac 必选
expires_in 过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间 可选
refresh_token 更新令牌,用来获取下一次的访问令牌 可选
scope 权限范围,如果与客户端申请的范围一致 可选

适用情况:用户对客户端高度信任,比如客户端是操作系统的一部分,或者由一个著名公司出品。而对于认证服务器,只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

客户端模式

OAuth2.0的客户端模式

A.客户端向认证服务器进行身份认证,并要求一个访问令牌。 URI 中包含的参数:

参数名 解释 可选性
Grant-type 授权类型,固定为"clientcredentials" 必选
scope 权限范围 可选
B.认证服务器确认无误后,向客户端提供访问令牌。
URI中包含的参数:
参数名 解释 可选性
:—– :—– :—–:
access_token 访问令牌 必选
token_type 令牌类型,bearer/mac类型 必选
expires_in 过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间 可选
refresh_token 更新令牌,用来获取下一次的访问令牌 可选
scope 权限范围,如果与客户端申请的范围一致 可选
注意:客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于 OAuth 框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

  1. http://tools.ietf.org/html/rfc6749  

  2. 该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端 ID 和重定向 URI,是一一对应关系。 

updatedupdated2023-12-052023-12-05