简单的理解:
OAuth 2.0授权框架支持第三方支持访问有限的HTTP服务,通过在资源所有者和HTTP服务之间进行一个批准交互来代表资源者去访问这些资源,或者通过允许第三方应用程序以自己的名义获取访问权限。
OAuth定义了四种角色:
1.resource owner(资源所有者)
2.resource server(资源服务器)
3.client(客户端):代表资源所有者并且经过所有者授权去访问受保护的资源的应用程序
4.authorization server(授权服务器):在成功验证资源所有者并获得授权后向客户端发出访问令牌
图解流程
A:授权请求,客服端向资源所有者
B:资源所有者向客户端发送授权许可
C:客户端拿着授权许可访问授权服务器
D : 授权服务器认证授权许可,发放token
E : 客户端拿着token请求资源服务器
F: 资源服务器返回 受保护的资源
一个授权许可是一个凭据,它代表资源所有者对访问受保护资源的一个授权,是客户端用来获取访问令牌的。
Authorization Grant
授权类型有四种:authorization code, implicit, resource owner password credentials, and client credentials
1.3.1. Authorization Code
授权码是授权服务器用来获取并作为客户端和资源所有者之间的中介。代替直接向资源所有者请求授权,客户端定向资源所有者到一个授权服务器,授权服务器反过来指导资源所有者将授权码返回给客户端。在将授权码返回给客户端之前,授权服务器对资源所有者进行身份验证并获得授权。因为资源所有者只对授权服务器进行身份验证,所以资源所有者的凭据永远不会与客户机共享。
1.3.2. Implicit
隐式授权是为了兼顾到在浏览器中用诸如JavaScript的脚本语言实现的客户端而优化的简化授权代码流程。在隐式授权流程中,不是发给客户端一个授权码,而是直接发给客户端一个访问令牌,而且不会对客户端进行认证。隐式授权提高了一些客户端(比如基于浏览器实现的客户端)的响应能力和效率,因为它减少了获得访问令牌所需的往返次数。
1.3.3. Resource Owner Password Credentials
资源所有者的密码凭据(比如,用户名和密码)可以直接作为授权许可来获取访问令牌。这个凭据只应该用在高度信任的资源所有者和客户端之间(比如,客户端是系统的一部分,或者特许的应用),并且其它授权模式不可用的时候。
1.3.4. Client Credentials
客户端凭据通常用作授权许可
1.3.5. Access Token
访问令牌是用来访问受保护的资源的凭据。一个访问令牌是一个字符串,它代表发给客户端的授权。令牌代表资源所有者授予的对特定范围和访问的时间(PS:令牌是有范围和有效期的),并由资源服务器和授权服务器强制执行。访问令牌可以有不同的格式、结构和使用方法。
1.3.6. Refresh Token
Refresh Token是用于获取Access Token的凭据。刷新令牌是授权服务器发给客户端的,用于在当前访问令牌已经失效或者过期的时候获取新的访问令牌。刷新令牌只用于授权服务器,并且从来不会发给资源所有者。
====================================================================================================
授权码请求
对应于步骤 (A) 和 (B) 的授权码请求如 图 1 所示。在步骤 (A) 中,客户端采用 application/x-www-form-urlencoded 格式向授权服务器发出一个请求,如 清单 1 所示。
清单 1. 授权码请求的示例
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com
该请求必须包含以下参数:
1.response_type:必选项。该值必须设置为 code。
2.client_id:必选项。客户端 ID。
3.redirect_uri:必选项。用于用户代理重定向。
4.scope:可选项。访问请求的范围。
5.state:可选项。保持请求和回调之间的状态。
在授权服务器验证请求后,服务器将一个 HTTP 重定向代码 302 响应发送回客户端。该响应还将在 http Location 标头中包括一个重定向 URI。在步骤 (B) 中,客户端必须将用户代理(通常是 Web 浏览器)重定向到此 URI。这种重定向 URI 通常是一个登录页面,资源所有者可以使用其凭据进行登录,并批准/撤销客户端的访问请求。
授权码响应
授权码响应该如 图 1 的步骤 © 中所示。如果资源所有者批准了访问请求,授权服务器会发出一个授权码。授权服务器将用户代理重定向到步骤 (A) 中作为请求的一部分的重定向 URI,并将授权码包含为重定向 URI 的查询组件的一部分,这里采用的是 application/x-www-form-urlencoded 格式。
URI 参数如下:
Code:必选项。由授权服务器生成的授权码。该代码是临时的,并且必须在生成后很快过期。客户不得多次使用授权码。使用相同代码进行的任何进一步请求都应该被授权服务器撤销。授权码被绑定到客户端标识符和重定向 URI。
State:必选项。如果客户端的授权码请求中存在 state 参数,此参数必须设置为与从客户端接收的值完全相同。
访问令牌请求
这对应于 图 1 中的步骤 (D)。客户端采用 application/x-www-form-urlencoded 格式向令牌端点(授权服务器)发出一个请求,如 清单 2 所示。
清单 2. 访问令牌请求的示例
POST /token HTTP/1.1
Host: server.example.com
Authorization:Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom&client_id=c342
访问令牌请求必须设置下列参数:
grant_type:必选项。该值必须设置为 authorization_code。
client_id:必选项。客户端 ID。
client_secret:可选项。密码,用于与授权服务器进行身份验证。
code:必选项。从服务器收到的授权码。
redirect_uri:必选项。在步骤 (A) 中发送的完全一样。
授权服务器验证该代码和重定向 URI 是有效的。在存在机密性客户端的情况下,授权服务器也使用在其请求的主体或 Authorization 标头中传递的客户端凭据来对客户端进行身份验证。
访问令牌响应
这对应于 图 1 中的步骤 (E)。如果访问令牌请求是有效的,而且获得了授权,授权服务器会在一个访问令牌响应中返回访问令牌。成功的响应示例如 清单 3 所示。
清单 3. 成功的访问令牌响应示例
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
“access_token”:“2YotnFZFEjr1zCsicMWpAA”,
“token_type”:“Bearer”,
“expires_in”:3600,
“refresh_token”:“tGzv3JOkF0XG5Qx2TlKWIA”,
“example_parameter”:“example_value”
}
如果请求无效,或者未经授权,那么授权服务器将会使用代码返回一个相应的错误消息。
刷新访问令牌请求
这是一个可选步骤,如果客户端请求离线访问,并在访问令牌请求中提供一个 refresh_token,则可以此阿勇此步骤。访问令牌是暂时性的,通常在一个小时后到期。访问令牌到期后,客户端需要重复身份验证过程,资源所有者需要进行登录,并提供授权,让客户可以再次发出访问令牌请求。
如果客户需要刷新访问令牌,而资源所有者没有位于浏览器上,无法进行登录和身份验证,则客户端可以采用离线访问。客户端可以在发出第一个授权码请求时请求离线访问(参见步骤 (A))。根据这项计划,除了访问令牌之外,授权服务器还会返回刷新令牌。刷新令牌是一个长寿令牌,不会过期,除非明确由资源所有者撤销。每当访问令牌到期时,客户端可以使用刷新令牌来重新生成一个访问令牌,资源所有者无需登录和授权访问请求。
客户端采用 application/x-www-form-urlencoded 格式向令牌端点(授权服务器)发出一个请求,如 清单 4 所示:
清单 4. 请求令牌端点
POST /token HTTP/1.1
Host: server.example.com
Authorization:Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
请求参数的定义如下:
grant_type:必选项。该值必须设置为 refresh_token。
refresh_token:必选项。这是之前从访问令牌请求获得的令牌。
scope:可选项。访问请求的范围。
授权服务器验证刷新令牌并发出一个新的访问令牌。
刷新访问令牌响应
如果请求成功,授权服务器将会返回一个新的访问令牌。成功的响应示例如 清单 5 所示。
清单 5. 刷新访问令牌响应
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
“access_token”:“2YotnFZFEjr1zCsicMWpAA”,
“token_type”:“Bearer”,
“expires_in”:3600,
“example_parameter”:“example_value”
}
如果请求无效,或者未经授权,那么授权服务器将会使用代码返回一个相应的错误消息。
================================================================================================
参考的博客
//oauth2.0的说明
https://www.cnblogs.com/cjsblog/p/9174797.html
//授权机制说明
https://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6
https://www.ibm.com/developerworks/cn/java/se-oauthjavapt3/