有人能帮我弄清楚到底发生了什么吗?
我正在尝试对一个用户可以上传和下载文件的应用程序进行负载测试。
旅程:
步骤-1:当用户从磁盘中选择一个文件(POST请求)时,它会创建一个fileID和带有uuid的路径。
响应如下所示:{"id":"FILE-VX-1234","path":"uuid/filename.jpg","uri":["s3://{location}/{uuid}/{filename}?endpoint=s3.dualstack.eu-west-1.amazonaws.com"],"state":"OPEN","size":-1,"timestamp":"2020-02-13T10:59:43.146+0000","refreshFlag":1,"storage":"STORAGEID","metadata":{}
步骤2:使用这些(POST请求),它使用带有assesskeyID、secretaccesskey和sessionToken的s3 uri进行响应。
响应如下所示:{"uri":["s3://{accesskeyID}:{secretaccesskey}@{storage location}/{uuid}/{filename}?endpoint=s3.dualstack.eu-west-1.amazonaws.com&sessionToken={security token}"]}
个
第3步:使用这些和添加的临时参数(日期),PUT请求上传s3桶中的文件。
标题类似于:
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Authorization: AWS4-HMAC-SHA256 Credential=${accesskeyID}/${currentDate}/{region}/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=${secretaccesskey}
Connection: keep-alive
Content-Length: 145541
Content-Type: image/jpeg
Host: <the host address>
Origin: https://{url}
Referer: https://{url}/upload/
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
X-Amz-Content-Sha256: UNSIGNED-PAYLOAD
X-Amz-Date:${currentDateInUTC}
x-amz-security-token: ${sessionToken}
X-Amz-User-Agent: aws-sdk-js/2.409.0 callback
错误:<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
我已经验证了在PUT请求中传递的签名(secretaccesskey)、accesskeyID和sessionToken是正确的。
- 注意:附加参数日期和“{region}/s3/aws4_request,SignedHeaders=主机; x-AMZ-内容-SHA 256; x-amz-日期;x-amz-安全令牌;授权错误中的x-amz-user-agent”是硬编码的。*
2条答案
按热度按时间628mspwn1#
如果不了解如何为请求生成签名(即
Authorization
头),就不可能提供任何帮助根据Signing and Authenticating REST Requests文章
Amazon S3 REST API使用基于密钥HMAC的自定义HTTP方案(散列消息验证代码)。要验证请求,首先将请求的选定元素连接起来形成一个字符串。然后使用AWS秘密访问密钥计算该字符串的HMAC。我们将此过程非正式地称为“对请求进行签名”,并将HMAC算法的输出称为签名。因为它模拟了真实的签名的安全属性。最后,使用本节中描述的语法将此签名作为请求的参数添加。
下面是一个伪代码,演示了如何生成标头:
您可以查看How to Handle Dynamic AWS SigV4 in JMeter for API Testing文章中的示例实现。
vatpfxk52#
AWS现在支持签名版本4,该版本需要在将文件上传到S3存储桶时生成。
上载时可以使用两种类型凭据:
在这两种情况下,您都需要在HTTP请求采样器下添加JSR 223预处理器。
将以下代码添加到JSR 223预处理器中,并提供所需的详细信息:
将以下参数提供给预处理器:
然后,将HTTP标头管理器添加到HTTP请求采样器中,其中添加了以下标头:
这里,下面是文件上传时由预处理器动态计算的头值:
现在,在HTTP请求采样器中设置请求方法(通常为PUT)、协议(例如https)、服务器(... s3.service.com)、端口(例如443)、路径(包括存储桶名称的文件路径)。
单击HTTP请求采样器中的"文件上载“选项卡,分析需要上载的本地文件的绝对路径,并提供mime类型。
注:不要提供参数名称(由于文件将以原始二进制格式传输,因此该名称将为空),并且由于文件将以原始格式传输,因此应取消选中“使用多部分/表单数据”复选框。
为了给予更多帮助,您可以使用
JSR223 Sampler
通过不同的文件上传/下载方法发出HTTP
请求。例如,将动态计算的数据上传为文件。请参考链接:How to pass data from JSR223 sampler to Http Request sampler in JMeter希望能对你有所帮助。