章节目录:
前言
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 安全协议(“两条腿”方案)。使用 OAuth 1.0a 和 OAuth 2.0 配置身份验证的说明如下。
OAuth 2.0
OAuth 2.0 RFC 为身份验证指定了不同的“流程”或“授权”类型。本文档介绍如何在 SOAtest 中使用三种最常见的流程:带 PKCE 或不带 PKCE 的 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
要在 SOAtest 中进行设置,首先需要创建一个测试场景,获取作为登录套件的授权码。相应地,需要令牌的测试方案也会调用该登录套件。无论您使用的授权码是否带有代码交换证明密钥(PKCE),操作步骤都是一样的,但如果使用 PKCE,则需要配置几个额外的变量。
创建登录测试套件
- 右键点击新项目文件夹,选择新建> 测试 (.tst) 文件。
- 为测试指定名称,选择 Web > 录制 web 场景。
- 点击下一步,选择录制新的 web 场景。
- 在开始录制自字段中输入授权端点 URL,然后点击下一步。
- 尽管被测应用程序(AUT)的 URL 会自动重定向到授权端点(即登录页面),但请不要使用该 URL。应使用授权端点本身的 URL,否则 AUT 会在您在测试中使用令牌之前消耗令牌。
- 启用添加 URL 变量到现有环境,然后点击完成。您的应用程序登录页面将会打开。
- 登录应用程序。获得授权后,服务提供商将使用代码作为 URL 参数的一部分将您重定向到回调 URL。
- 关闭浏览器,完成录制。
- 运行一次测试,为测试添加通讯报文。
- 右键点击包含登录操作的测试节点(根据登录程序的不同而有所不同,但通常是录制场景中的最后一个测试),选择添加输出...,然后启用 HTTP 通讯报文。
- 点击下一步,然后选择包含访问代码的重定向 URL。
请求 URL 会因使用的应用程序而有所不同。例如,对于 Azure AD,请求 URL 的开头类似 https://login.microsoftonline.com/kmsi,而对于 Keycloak,请求 URL 的开头则类似 https://localhost:8443/auth/realms/my-realm/login-actions/authenticate。无论如何,URL 都将包含
?code=
参数,后面跟随访问代码。
- 点击下一步,选择响应:消息头 > 文本数据库提取代码。
- 点击完成,然后再次运行测试以填充文本数据库。
- 打开文本数据库,在文本内容中找到包含代码的重定向位置(通常在“位置”标题中)。在该 URL 中,应能找到授权码(前面有“code=”参数)。选择该代码,然后点击从所选中创建提取。将其命名为
OAUTH2_AUTHORIZATION_CODE
并点击 OK。 - 可选:对授权端点进行参数化。在登录套件中设置身份验证端点的参数可使其适应性更佳。操作步骤:
- 在录制场景中打开导航到授权端点的测试(通常是第一个测试),然后点击用户操作选项卡。
在 URL 字段中,根据需要将下列参数从静态值更改为指定变量:
参数 变量 client_id ${OAUTH2_CLIENT_ID}
redirect_id ${OAUTH2_REDIRECT_URI}
作用域 ${OAUTH2_SCOPE}
读者 ${OAUTH2_AUDIENCE}
- 如果您选择
Authorization Code with PKCE
为授权类型,请参阅下一步了解更多参数化要求。
- 如果您选择
- 保存变更。
- 如果使用 PKCE 授权码,则必须将授权端点配置为接受
code_challenge
和code_challenge_method
参数的变量。操作步骤:- 在录制场景中打开导航到授权端点的测试(通常是第一个测试),然后选择用户操作选项卡。
在 URL 字段中,将下列参数从静态值更改为指定变量:
参数 变量 code_challenge ${OAUTH2_CODE_CHALLENGE}
code_challenge_method ${OAUTH2_CODE_CHALLENGE_METHOD}
- 保存变更。
在通过设置上述一个或多个变量对授权端点进行参数化后,如果仍然想要独立运行 web 场景,则可以在变量选项卡中为参数化值设置默认值。更多信息,请参阅配置测试套件属性 - 测试流程逻辑、变量等。页面的“定义变量”。
为测试套件设置共享 OAuth 2.0 身份验证
- 右键点击测试套件,选择新建 > 全局属性...
- 展开身份验证列表,然后选择 OAuth 2.0 并点击下一步。
- 根据需要将 授权类型设置为
Authorization Code
或Authorization Code with PKCE
,点击完成。此时会打开 OAuth 2.0 身份验证配置界面。 - 在名称字段输入一个易于识别的名称。
- 按以下描述配置其余设置。如果选择在登录套件中对授权端点进行参数化,这些设置将用于获取合适的 OAuth 2.0 令牌。如果没有对授权端点进行参数化(或只对其中部分进行参数化),请确保未参数化的设置与授权端点 URL 中的设置完全匹配。
- 登录套件:点击工作空间,选择上文创建的登录套件。
- 重定向 URI:输入不消耗 OAuth 2.0 令牌的重定向 URI。该 URI 应在授权服务器的重定向 URI 白名单中。
- 令牌 URI:输入 OAuth 2.0 授权服务器上的访问令牌端点。
- 客户端 ID:输入授权服务器进行身份验证所需的客户端 ID。
- 客户端密码:输入授权服务器进行身份验证所需的客户端秘密。
- 作用域:客户端使用此参数来请求对应用程序的受限访问。可以输入一系列以逗号分隔的授权服务器特定值。请参阅 https://oauth.net/2/scope/ 获取更多信息。如果没有指定范围,则可能返回默认范围。
- 客户:输入资源服务器的 URI。
- 代码验证器(仅用于 Authorization Code with PKCE):选择生成代码验证器的方法。默认情况下会自动完成,建议选择自动。自动生成的代码验证器符合 OAuth 2.0 标准,是一个加密随机字符串,使用 A-Z、a-z、0-9 字符以及标点符号 - ._ ~(连字符、句点、下划线和波浪号),长度为 43 到 128 个字符。如果选择不同的方法,请确保结果符合相应标准,否则令牌请求可能会被拒绝。
- Challenge 方法(仅用于 Authorization Code with PKCE):选择代码验证器纯文本版本或代码校验器 SHA-256 版本的 code challenge。
- 选择使用消息头或查询参数发送访问令牌。
- 保存配置。
创建测试场景
右键点击要创建测试场景的项目,然后选择新建 > 测试 (.tst) 文件。根据您的应用程序和测试需要完成场景创建。如果您已经有了要使用的场景,则可以跳过这一步。
负载测试
如果打算对该场景进行负载测试,则应配置测试套件,将测试作为一个组执行(打开测试套件,前往执行选项>测试执行选项卡)。如果在配置测试套件时启用了“测试可单独运行”选项,则每个虚拟用户都将单独运行套件中的一个测试,不会重复使用 OAuth 2.0 访问令牌,而 Load Test 将不得不重复执行登录套件,以获取新的访问令牌。
- 右键点击测试场景并选择新建 > 测试。在测试场景中创建一个新的 REST 客户端,将方法设置为
GET
,将 URL 设置为您的 AUT。 - 如果您之前创建的共享身份验证是为该测试套件创建的唯一身份验证,那么它将被自动应用。否则,请点击安全性下的授权,然后从身份验证窗格的第一个下拉菜单中找到定制并选择。
- 运行场景并确认已成功获取和使用 OAuth 2.0 令牌。
客户凭证流
客户端使用此授予类型来获取用户上下文之外的访问令牌。客户端应用程序通常使用它来访问有关其自身的资源,而不是访问用户的资源。有关此流程的详细信息,请参阅 OAuth 2.0 Framework 文档:https://tools.ietf.org/html/rfc6749#section-4.4.
为测试套件设置共享 OAuth 2.0 身份验证
- 右键点击测试套件,选择新建 > 全局属性...
- 展开身份验证列表,然后选择 OAuth 2.0 并点击下一步。
- 将授权类型设置为
Client Credentials
,点击完成。此时会打开 OAuth 2.0 身份验证配置界面。 - 在名称字段输入一个易于识别的名称。
- 配置剩余的设置:
- 令牌 URI:输入 OAuth 2.0 授权服务器上的访问令牌端点。
- 客户端 ID:输入授权服务器进行身份验证所需的客户端 ID。
- 客户端密码:输入授权服务器进行身份验证所需的客户端秘密。
- 作用域:(可选)指定访问令牌的范围。如需多个参数,请用逗号分隔。请参阅 https://oauth.net/2/scope/ 获取更多信息。如果没有指定范围,则可能返回默认范围。
- 客户:(可选)输入资源服务器的 URI。
- 选择使用消息头或查询参数发送访问令牌。
- 保存配置。
创建测试场景
- 右键点击测试套件,选择添新建 > 测试。在测试套件中创建一个新的 REST 客户端。
- 点击 HTTP 选项选项卡,从传输菜单中选择 HTTP 1.0 或 HTTP 1.1。
- 如果您之前创建的共享身份验证是为该测试套件创建的唯一身份验证,那么它将被自动应用。否则,请点击安全性下的授权,然后从身份验证窗格的第一个下拉菜单中找到并选择定制。
- 点击资源选项卡,然后指定您的 REST 调用方法和端点,包括任何要求的参数。
- 将自动注入 OAuth 2.0 访问令牌。
- 运行方案并验证发送的预期 HTTP 请求头。授权请求头示例:
Authorization: Bearer 2YotnFZFEjr1zCsicMWpAA
负载测试注意事项
如需对场景进行负载测试,应在其父测试套件中启用“测试以组运行”(可在执行选项 > 测试执行选项卡中找到)。该选项允许每名虚拟用户(VU)运行整个场景,因此每名虚拟用户都能获取并重复使用自己的 OAuth 2.0 访问令牌。如果启用“测试可单独运行”,则每名虚拟用户都将单独运行套件中的一个测试,不重复使用访问令牌,每个测试都获取自己的令牌,为获取新的访问令牌,这将导致重复执行登录套件。
故障排除
与 OAuth 2.0 相关的错误一般可分为两种类型:获取 OAuth 2.0 授权码的错误或获取访问令牌的错误。在开始排除故障之前,请查看质量任务视图中的错误,以确定您遇到的问题类型。
如果问题出在获取授权码上:
- 请尝试直接运行登录套件,确保其按预期运行。
- 如果在登录套件中对授权端点进行了参数化,则仍可通过在变量选项卡中为参数化值设置默认值来独立运行授权端点。更多信息,请参阅配置测试套件属性 - 测试流程逻辑、变量等。页面的“定义变量”。
- 在测试运行时,请检查控制台视图中的消息。
如果问题出在获取访问令牌上:
- 在质量任务视图中右键点击 OAuth 2.0 错误,然后选择查看相关通讯报文,检查与错误相关的通讯报文。
OAuth 1.0a
针对 OAuth 1.0a 进行身份验证包括以下常规步骤:
- 从服务提供商处获取并授权请求令牌。
- 将请求令牌交换为访问令牌。
- 签署 Oauth 请求以访问受保护的资源。
以下示例使用 REST 客户端向服务器发送请求消息。您也可以以同样的方式使用消息传送客户端。
向服务提供商获取并授权请求令牌
- 创建一个新的 REST 客户端并配置获取请求令牌的位置的设置。
- 点击 HTTP 选项选项卡,从传输菜单中选择 HTTP 1.0 或 HTTP 1.1。
- 点击安全性下的授权。
- 从授权窗格的第一个下拉菜单中选择定制。
- 如果已为测试套件设置了用于获取请求令牌的 OAuth 1.0 共享身份验证(请参阅配置测试套件属性 - 测试流程逻辑、变量等。页面的“指定客户端选项”),则可从第二个下拉菜单中选择,然后跳至步骤 11。
- 点击新建,选择 OAuth 1.0,然后点击完成。将 OAuth 1.0 身份验证添加到测试套件的身份验证节点中(如果这是添加到测试套件中的第一个自定义身份验证,则会自动创建身份验证节点)。
- 在名称字段输入一个易于识别的名称。
- 在用户密钥和用户隐私 字段中输入相应值。
- 从模式菜单中选择“获取请求令牌”。
- (可选)在范围字段中指定范围。
- (可选)在参数下添加其他 OAuth 参数。
- 将文本数据库附加到 REST 客户端的响应通讯报文,并提取请求令牌和请求令牌密钥。令牌通常表示为
oauth_token
。 - 从主菜单中前往文件 > 新建 > 测试 (.tst) 文件,选择您的项目。
- 为文件输入名称,然后点击下一步。
- 选择 Web> 录制 web 场景,点击下一步。
- 选择录制新的 web 场景,然后点击下一步。
- 在开始记录自字段中,输入 URL 以获取验证码。添加一个
oauth_token
参数并指定在步骤 10 中获得的请求令牌的值。
浏览器启动后,它将显示托管受保护资源的服务器的登录页面。 - 通过提供用户的登录凭据(用户名/密码)登录。获得授权后,浏览器会将您重定向到带有验证码的新页面。
- 在看到验证码后,关闭浏览器退出录制。
- 关联浏览器数据库和浏览器内容(呈现的 HTML),然后提取验证码的值。
- 打开浏览器播放工具,将字面量请求令牌字符串替换为文本数据库生成的请求令牌数据源列(步骤 10)。使用
${varName
} 语法,如下所示。
将请求令牌交换为访问令牌
- 创建一个新的 REST 客户端,并配置用请求令牌交换访问令牌的位置的设置。
- 点击 HTTP 选项,然后从传输菜单中选择 HTTP 1.0 或 HTTP 1.1。
- 点击安全性下的授权。
- 从授权窗格的第一个下拉菜单中选择定制。
- 如果已为测试套件设置了将请求令牌交换为访问令牌的 OAuth 1.0 共享身份验证(请参阅配置测试套件属性 - 测试流程逻辑、变量等。页面的“指定客户端选项”),则可从第二个下拉菜单中选择,然后跳至步骤 10。
- 点击新建,选择 OAuth 1.0,然后点击完成。将 OAuth 1.0 身份验证添加到测试套件的身份验证节点中(如果这是添加到测试套件中的第一个自定义身份验证,则会自动创建身份验证节点)。
- 在用户密钥和用户隐私字段中输入相应值。
- 在模式菜单中选择“用请求令牌交换访问令牌”。
- 从文本数据库提取中参数化请求令牌和请求令牌私密字段。
- 从浏览器数据库中参数化验证码字段。
- 将文本数据库附加到 REST 客户端的响应通讯报文,并提取访问令牌(通常表示为 oauth_token)和访问令牌密钥(通常表示为 oauth_token_secret)。
签署 Oauth 请求以访问受保护的资源
- 创建一个新的 REST 客户端,并配置用请求令牌交换访问令牌的位置的设置。
- 点击 HTTP 选项,然后从传输菜单中选择 HTTP 1.0 或 HTTP 1.1。
- 点击安全性下的授权。
- 从授权窗格的第一个下拉菜单中选择定制。
- 如果已为测试套件设置了用于 OAuth 身份验证请求签名的 OAuth 1.0 共享身份验证(请参阅配置测试套件属性 - 测试流程逻辑、变量等。页面的“指定客户端选项”),则可从第二个下拉菜单中选择,然后跳至步骤 9。
- 点击新建,选择 OAuth 1.0,然后点击完成。将 OAuth 1.0 身份验证添加到测试套件的身份验证节点中(如果这是添加到测试套件中的第一个自定义身份验证,则会自动创建身份验证节点)。
- 在用户密钥和用户隐私字段中输入相应值。
- 在模式菜单中选择“签署 Oauth 认证请求”。
- 从文本数据库提取中参数化访问令牌和访问令牌私密字段。
- 请求用户的私有资源。由于已经获得了访问令牌,应能正常访问。