此问题通常是由于生成的AWS S3请求签名与服务器收到的签名不匹配而引起的。可以通过以下步骤解决此问题:
#include
#include
#include
Aws::Auth::AWSCredentialsProvider* credsProvider = Aws::MakeShared("myApp");
Aws::Auth::AWSCredentials creds = credsProvider->GetAWSCredentials();
Aws::String region = "us-east-1";
Aws::String service = "s3";
Aws::String signing = "aws4_request";
Aws::String algorithm = "AWS4-HMAC-SHA256";
Aws::String hashedPayload = Aws::Utils::HashingUtils::HexEncode(Aws::Utils::CryptoUtils::Sha256(requestPayload));
auto signingKey = Aws::Auth::AWSSignature::CalculateSigningKey(creds.GetAWSSecretKey(), creds.GetAWSRegion(), creds.GetAWSAccessKeyId(), service, signing, algorithm);
Aws::String signature = Aws::Auth::AWSSignature::CalculateSignature(
algorithm,
signingKey,
creds.GetAWSAccessKeyId(),
dateStamp,
region,
service,
hashedPayload);
其中,credsProvider
是用于获取访问密钥和ID的AWS凭证提供程序,service
是您正在使用的AWS服务的名称(例如S3),hashedPayload
是请求负载的哈希值。计算签名后,将其添加到请求的标头中。
Aws::Http::Standard::StandardHttpRequest request;
request.SetUri(uri);
request.SetMethod(Aws::Http::HttpMethod::HTTP_GET);
request.SetHeader("Host", "s3.amazonaws.com");
request.SetHeader("x-amz-content-sha256", hashedPayload);
request.SetHeader("x-amz-date", amzdate);
request.SetHeader("Authorization", "AWS4-HMAC-SHA256 Credential=" + creds.GetAWSAccessKeyId() + "/" + credentialScope + ", SignedHeaders=host;x-amz-content-sha256;x-amz