You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karate自动化测试中调用API端点时如何传递AWS签名?

在Karate中传递AWS签名的解决方案

核心逻辑

AWS签名基于SigV4规范生成,Karate本身无内置SigV4支持,需通过自定义Java工具类生成签名后,将签名信息注入请求头完成调用。

具体实现步骤

1. 引入AWS SDK依赖

在项目的pom.xml中添加AWS认证相关依赖(使用最新稳定版本):

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>auth</artifactId>
    <version>2.25.0</version>
</dependency>
<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>regions</artifactId>
    <version>2.25.0</version>
</dependency>

2. 编写SigV4签名生成工具类

创建Java类封装签名逻辑,自动处理凭证获取、签名计算:

import software.amazon.awssdk.auth.signer.Aws4Signer;
import software.amazon.awssdk.auth.signer.params.Aws4SignerParams;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.http.SdkHttpFullRequest;
import software.amazon.awssdk.http.SdkHttpMethod;

import java.net.URI;
import java.util.HashMap;
import java.util.Map;

public class AwsSigV4Signer {
    public static Map<String, String> generateSignature(String method, String url, Map<String, String> headers, String payload) {
        // 构建基础请求对象
        SdkHttpFullRequest.Builder requestBuilder = SdkHttpFullRequest.builder()
                .method(SdkHttpMethod.fromValue(method))
                .uri(URI.create(url));

        // 注入自定义请求头
        if (headers != null) {
            headers.forEach(requestBuilder::putHeader);
        }

        SdkHttpFullRequest rawRequest = requestBuilder.build();

        // 配置签名参数
        Aws4SignerParams signParams = Aws4SignerParams.builder()
                .credentialsProvider(DefaultCredentialsProvider.create())
                .signingRegion(Region.of("us-east-1")) // 替换为你的API部署区域
                .signingName("execute-api") // 服务标识:API Gateway填execute-api,S3填s3,依此类推
                .build();

        // 生成签名并返回带签名的请求头
        Aws4Signer signer = Aws4Signer.create();
        SdkHttpFullRequest signedRequest = signer.sign(rawRequest, signParams);
        
        return new HashMap<>(signedRequest.headers());
    }
}

3. 在Karate脚本中调用签名工具

在Feature文件中引入工具类,生成签名后发起请求:

Feature: AWS API自动化测试

Background:
  * def AwsSigV4Signer = Java.type('com.your.package.AwsSigV4Signer')
  * def apiUrl = 'https://your-api-id.execute-api.us-east-1.amazonaws.com/prod/your-endpoint'
  * def requestMethod = 'POST'
  * def baseHeaders = { 'Content-Type': 'application/json' }
  * def requestBody = { "key": "value" }

Scenario: 调用带AWS签名的API
  * def signedHeaders = AwsSigV4Signer.generateSignature(requestMethod, apiUrl, baseHeaders, requestBody)
  * url apiUrl
  * method requestMethod
  * headers signedHeaders
  * request requestBody
  * status 200

4. 本地凭证配置

确保测试环境能获取有效AWS凭证,支持以下方式:

  • 配置环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY
  • 在~/.aws/credentials文件中写入凭证信息
  • 运行环境绑定IAM角色(如EC2/ECS等AWS服务内)

关键注意事项

  • 服务标识signingName必须与目标AWS服务匹配,填错会导致签名验证失败
  • 签名区域需与API部署区域完全一致
  • POST/PUT请求的payload需与签名生成时传入的内容完全一致(含空格、换行符)
  • GET请求的Query参数需包含在签名生成的请求对象中,可扩展工具类添加参数处理逻辑

内容的提问来源于stack exchange,提问作者Prasad kamaraju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:27:57