本章:
前言
Oauth (开放授权)身份验证协议使用户可以授予第三方应用程序对其私有资源的访问权限,而无需透露登录凭据。它还提供了一种方法来限制可以访问的信息量。
Oauth 将用户角色(也称为资源所有者)引入了传统的客户端-服务器身份验证模型。在传统的客户端-服务器身份验证模型中,客户端直接访问服务器上托管的资源。在 Oauth 模型中,客户端必须先从资源所有者获得许可,然后才能从服务器访问资源。此许可权以令牌和匹配的共享秘密密钥的形式表示。
OAuth 2.0 和 1.0a 是不同的实现,并且不兼容请访问 Oauth 网站以了解更多信息:https://oauth.net/2/.
示例场景
假设用户(资源所有者)希望授予打印服务(客户端)对其存储在照片共享服务(服务器)中的私人照片的访问权限。用户可以执行 Oauth 身份验证来授予打印服务访问其私人照片的权限,而不是向打印服务透露用户的登录凭据。这将分三个阶段进行:
- 打印服务从照片共享服务请求临时凭证。
- 打印服务收到凭据后,会将用户重定向到照片共享服务的 Oauth 授权 URL ,然后用户提供登录凭据。注意在此步骤中,打印服务无法查看用户的登录凭据。一旦用户决定授予打印服务访问私人照片的权限,就会生成确认验证码。
- 然后,打印服务将临时凭据和验证码交换为访问令牌。一旦打印服务获得了访问令牌,他们便可以从照片共享服务获取并打印用户的私人照片。
Parasoft 支持 OAuth
Parasoft 支持针对 Web 服务器流和客户端凭据流的 OAuth 1.0a 和 2.0 安全协议(两足方案)。您可以在 HTTP 传输的 Oauth身份验证部分为 OAuth 1.0a 配置 Oauth 身份验证设置对于 OAuth 2.0,这个身份验证是在 REST 客户端的资源和有效负载选项卡中配置的。
OAuth 2.0
OAuth 2.0 RFC 为身份验证指定了不同的流或授权类型:
- 授权代码(Web 服务器)流程
- 客户凭证流
- 设备代码
- 刷新令牌
本文档描述了两个最常见的流程:Web服务器(授权代码) 和客户端凭据流程
有关 OAuth 2.0 其他信息,请查阅 https://oauth.net/2/grant-types/ 。
Web 服务器(授权码)流程
机密和公共客户端使用此授予类型来交换访问令牌的授权代码。用户通过重定向 URL 返回到客户端后,应用程序将从 URL 获得授权代码,并使用它来请求访问令牌。有关此流程的详细信息,请参阅 OAuth 2.0 Framework 文档:https://tools.ietf.org/html/rfc6749#section-4.1
请求授权
- 右键单击新项目文件夹和选择 Add New> Test (.tst) File。
- 为测试指定名称,然后选择 Web > Record web scenario。
- 右击 Next然后选择Record new web scenario。
- 在开始记录来源字段中指定 OAuth URL 参数。
- 单击 Finish并登录到您的应用程序。获得授权后,服务提供商将使用代码作为 URL 参数的一部分将您重定向到回调 URL。
- 关闭浏览器,来完成录制。
- 右键单击 Request > Validate Header 节点,然后选择 Add Output。> HTTP 通讯报文
- 单击 Next,然后选择包含访问代码的重定向 URL。
- 单击Next,然后选择Text Data Bank以提取代码。
获得访问令牌
- 创建一个新的 REST 客户端,并为 URL 提供必要的参数。URL 参数之一应称为
code
。应该对照上一步中的文本数据库提取来参数化此值。 - 根据响应格式,将适当的数据库(即 Text,JSON)附加到 REST 客户端并提取访问令牌。
访问受保护的资源
对于每次 REST API 调用,创建新的 REST 客户端并为其所需 URL 提供必要 URL 参数。其中一个 URL 参数应该被称为 oauth_token
,并具有在上一测试步骤中提取到访问令牌的值。
客户凭证流
客户端使用此授予类型来获取用户上下文之外的访问令牌客户端通常使用它来访问有关其自身的资源,而不是访问用户的资源。有关此流程的详细信息,请参阅 OAuth 2.0 Framework 文档:https://tools.ietf.org/html/rfc6749#section-4.4
获得访问令牌
- 将 REST 客户端添加到您的测试套件中。为了清楚起见,您可以重命名客户端Obtain Access Token。
- 单击 Resource选项卡,然后从下拉菜单选择 POST 。
- 在URL字段中指定授权服务器的端点。
- 单击Payload选项卡,然后从有效负载格式菜单中选择URL Encoded。
从输入模式菜单中选择表并配置以下参数:
参数 说明 要求 client_id
client_secret
这些参数可用于提供用于与授权服务器进行身份验证的凭据。使用 HTTP 身份验证来进行身份验证,而不是发送这些参数。
如果使用 HTTP 身份验证,请在 HTTP 选项>安全性> Http 身份验证下提供凭据。
有时 grant_type
值必须为 client_credentials
Yes 作用域
客户端使用此参数来请求对应用程序的受限访问。
指定专用于授权服务器的值的逗号分隔列表。如果不存在,授权服务器将拒绝该请求或返回具有默认范围的访问令牌。授权服务器还可以返回范围不同于客户端最初在此处请求的访问令牌。
https://oauth.net/2/scope/有关其他信息,请查阅
有时 读者
指定资源服务器的 URI。为了指示访问令牌将被限制访问哪个服务器,可能需要此参数。 有时 运行 RES T客户端并验证响应消息。响应示例:
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 { "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"Bearer", "expires_in":3600, "scope":"read_something" }
- 右键单击 Rest 客户端程序,然后选择 Add Output。
- 选择Response > Traffic > JSON Data Bank 然后单击Finish。
- 为
access_token
和token_type
值创建提取。以下部分假设为了与提取相对应您已命名数据库列为“ access_token” 和 token_type“。
访问受保护的资源
您的客户端现在可以通过包括从 JSON 数据库中提取的访问令牌来调用所有受保护的资源。
- 将 REST 客户端添加到您的测试套件中。
- 单击 Resource选项卡,然后指定您的 REST 调用方法和端点,包括任何预期的参数。
- 点击 HTTP Options 选项卡然后选择HTTP Headers 设置。
- 添加名称为
Authorization
且值为${token_type} ${access_token}
的HTTP 请求头。${Token_type}
和${access_token}
值应与在上一个测试中创建的 JSON 数据库的名称匹配。单个空格必须分隔值。 - 运行方案并验证发送的预期 HTTP 请求头。授权标头示例:
Authorization承载 2YotnFZFEjr1zCsicMWpAA
OAuth 1.0a
针对 OAuth 1.0a 进行身份验证包括以下常规步骤:
- 从服务提供商处获取并授权请求令牌
- 将请求令牌交换为访问令牌
- 签署 Oauth 请求以访问受保护的资源
以下示例使用 REST 客户端向服务器发送请求消息。您也可以以相同方式使用传送客户端。
向服务提供商获取并授权请求令牌
- 创建一个新的 REST 客户端并配置获取请求令牌的位置的设置
- 单击HTTP Options,然后从传输菜单中选择HTTP 1.0或 HTTP 1.1。
- 点击OAuth Authentication设置并启用Perform Authentication 选项。完成 Oauth 身份验证配置所需的其他字段将变为活动状态。
- 在消费者密钥和消费者秘密字段中输入消费者密钥和消费者秘密。
- 从 OAuth 模式菜单中选择Obtain Request Token。
- (可选)在范围字段中指定范围。
- (可选)在 Oauth 参数下添加其他 Oauth 参数。
- 将文本数据库附加到 REST 客户端的响应通讯报文,并提取请求令牌和请求令牌密钥。令牌通常表示为
oauth_token
。 - 从主菜单中选择File > New > Test (.tst) File然后选择您的项目。
- 为文件输入名称,然后单击 Next。
- 选择 Web> Record web scenario ,然后单击 Next。
- 选择 Record new web scenario ,然后单击 Next。
- 在开始记录自字段中,输入 URL 以获取验证码。添加一个
oauth_token
参数并指定在步骤 8 中获得的请求令牌的值。
浏览器启动后,它将显示托管受保护资源的服务器的登录页面。 - 通过提供用户的登录凭据(用户名/密码)登录。获得授权后,浏览器会将您重定向到带有验证码的新页面。
- 在看到验证码后,通过关闭浏览器退出记录。
- 将浏览器数据库附加到浏览器内容(呈现的 HTML ),然后提取验证码的值。
- 打开浏览器播放工具,将文字请求令牌字符串替换为文本数据库生成的请求令牌数据源列(步骤 7)。使用
${varName
}语法,如下所示。
将请求令牌交换为访问令牌
- 创建一个新的 REST 客户端,并为应该将请求令牌交换为访问令牌的位置配置设置。
- 单击HTTP Options,然后从传输菜单中选择HTTP 1.0或 HTTP 1.1。
- 点击OAuth Authentication设置并启用Perform Authentication 选项。完成 Oauth 身份验证配置所需的其他字段将变为活动状态。
- 在消费者密钥和消费者秘密字段中输入消费者密钥和消费者秘密。
- 在 Oauth 模型菜单中选择 Exchange Request Token for Access Token。
- 从文本数据库提取中参数化请求令牌和请求令牌密钥字段。
- 从浏览器数据库中设置验证码字段的参数。
- 将文本数据库附加到 REST 客户端的响应通讯报文,并提取访问令牌(通常表示为 oauth_token)和访问令牌密钥(通常表示为 oauth_token_secret)。
签署 Oauth 请求以访问受保护的资源
- 创建一个新的 REST 客户端,并为应该将请求令牌交换为访问令牌的位置配置设置。
- 单击HTTP Options,然后从传输菜单中选择HTTP 1.0或 HTTP 1.1。
- 点击OAuth Authentication设置并启用Perform Authentication 选项。完成 Oauth 身份验证配置所需的其他字段将变为活动状态。
- 在消费者密钥和消费者秘密字段中输入消费者密钥和消费者秘密。
- 在 Oauth 模型菜单中选择 Sign Request for OAuth Authentication。
- 从文本数据库提取中参数化访问令牌和访问令牌密钥字段。
- 请求用户的私人资源。应该可能,因为已经获得了访问令牌。