概述
OAuth 是一个开放的授权标准,允许客户端代表一个资源所有者获得对受保护服务器资源的访问权限。资源所有者可以是另一个客户端或最终用户。OAuth 还可以帮助最终用户将对其服务器资源的访问权限授权给第三方,而不必共享其凭据,比如用户名和密码。本系列文章遵从 RFC6749 中列出的 OAuth 2.0 授权框架。可以在 Internet Engineering Task Force 的网站上找到 RFC 6749 中列出的完整 OAuth 2.0 授权框架(请参阅 )。
授权批准
授权批准是一种凭据,可代表资源所有者用来获得访问受保护资源的访问权。客户端使用此凭据获取访问令牌,而且此访问令牌最终将与请求一起发送,以便访问受保护资源。OAuth 2.0 定义了四种授权类型:授权码
隐式
资源所有者密码凭据
客户端凭据
这个文章系列由四个部分组成,将引导您使用上面列出的每种授权类型在 Java™ 编程中实现 OAuth 2.0 客户端。在第 2 部分中,我将解释如何实现客户端凭据授权。本文将详细介绍这种授权,并解释示例客户端代码,此代码可用于兼容 OAuth 2.0 的任何服务器接口,以便支持这种授权。在本文的最后,您应该对客户端实现有了全面的了解,并准备好下载示例客户端代码,自己进行测试。
客户端凭据授权
在此授权中,机密客户端可以只使用其客户端凭据(或其他可支持的身份验证方法,比如公钥/私钥对)从授权服务器请求一个访问令牌。假设客户端在请求访问在其自身控制下的受保护资源(客户端是资源所有者)。
图 1 中所示的流程包括以下步骤:
(A) OAuth 2.0 客户端使用其客户端凭据和授权服务器进行身份验证,并从令牌端点请求访问令牌
(B) 授权服务器对 OAuth 2.0 客户端进行身份验证,并验证客户端凭据,如果凭据是有效的,那么授权服务器将会颁发一个访问令牌。
图 1. 客户端凭据流
访问令牌请求
对应于 步骤 A 的访问令牌请求如 图 1 所示。
客户端对令牌端点(授权服务器)发出请求,采用 application/x-www-form-urlencoded 格式发送以下参数。grant_type:必选项。该值必须设置为 “client_credentials“
client_id:必选项。客户端 ID。
client_secret:必选项。客户端密钥/密码。
scope:可选项。访问请求的范围
因为客户端身份验证被用作授权批准,所以不需要额外的授权。例如,客户端利用传输层安全性发出下列 HTTP 请求:
清单 1. 客户端 HTTP 请求POST /token HTTP/1.1
Host: server.example.com
Authorization:Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=myApp&client_secret=ab32vr
访问令牌响应
对应于 步骤 B 的访问令牌响应该如 图 1 所示。如果访问令牌请求是有效的,而且获得了授权,那么授权服务器将会返回访问令牌。成功的响应如 清单 2 所示。
清单 2. 访问令牌响应HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8Cache-Control: no-storePragma: no-cache{ "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"example", "expires_in":3600, "example_parameter":"example_value"}
如果请求无效,或者未经过授权,那么授权服务器将会使用代码返回一个相应的错误消息。
设置
下载部分 的 OAuth2.0_client_credentials.zip 文件中提供了示例 Outh2.0 客户端。其代码被组织为可导入 Eclipse 环境中的 Java 项目。