没有SDK在apex中调用AWS S3 api如何计算签名举个具体的例子包含stringToSign是如何得来的
在Apex中调用AWS S3 API时,可以使用AWS Signature Version 4算法来计算签名。以下是一个具体的例子,包括如何计算签名所需的stringToSign。
假设我们要调用S3 API的GetObject操作,假设我们的AWS账号的Access Key为"ACCESS_KEY",Secret Key为"SECRET_KEY",Bucket名称为"my-bucket",Object Key为"my-object.txt"。
首先,我们需要构建一个规范请求(Canonical Request)。规范请求由HTTP请求方法、URI路径、查询字符串、标头和请求正文组成。以下是构建规范请求的示例代码:
String method = 'GET';
String service = 's3';
String host = 's3.amazonaws.com';
String region = 'us-east-1';
String endpoint = 'https://s3.amazonaws.com';
String bucket = 'my-bucket';
String objectKey = 'my-object.txt';
String canonicalURI = '/' + bucket + '/' + objectKey;
String canonicalQueryString = '';
String canonicalHeaders = 'host:' + host + '\n';
String signedHeaders = 'host';
String payloadHash = 'UNSIGNED-PAYLOAD'; // 对于GET请求,正文为空,所以设置为UNSIGNED-PAYLOAD
String canonicalRequest = method + '\n' + canonicalURI + '\n' + canonicalQueryString + '\n' + canonicalHeaders + '\n' + signedHeaders + '\n' + payloadHash;
接下来,我们需要构建一个字符串到签名(String to Sign)。字符串到签名由算法(AWS4-HMAC-SHA256)、时间戳、凭证范围、规范请求的哈希值组成。以下是构建字符串到签名的示例代码:
Datetime now = Datetime.now();
String amzDate = now.formatGMT('yyyyMMdd\'T\'HHmmss\'Z\'');
String datestamp = now.formatGMT('yyyyMMdd');
String credentialScope = datestamp + '/' + region + '/' + service + '/aws4_request';
String stringToSign = 'AWS4-HMAC-SHA256\n' + amzDate + '\n' + credentialScope + '\n' + Crypto.generateDigest('SHA-256', canonicalRequest);
最后,我们可以使用AWS Secret Key和上述计算得到的字符串到签名来计算最终的签名。以下是计算签名的示例代码:
Blob kSecret = Blob.valueOf('AWS4' + 'SECRET_KEY');
Blob kDate = Crypto.generateMac('HMACSHA256', Blob.valueOf(datestamp), kSecret);
Blob kRegion = Crypto.generateMac('HMACSHA256', Blob.valueOf(region), kDate);
Blob kService = Crypto.generateMac('HMACSHA256', Blob.valueOf(service), kRegion);
Blob kSigning = Crypto.generateMac('HMACSHA256', Blob.valueOf('aws4_request'), kService);
String signature = EncodingUtil.base64Encode(Crypto.generateMac('HMACSHA256', Blob.valueOf(stringToSign), kSigning));
现在,我们可以将签名添加到请求标头中,并进行S3 API调用。注意,在实际请求中,还需要设置其他标头(如Host、Authorization等)和查询参数(如AWS Access Key等),这里只展示了计算签名的部分。
这就是在Apex中调用AWS S3 API时如何计算签名的示例,包括如何得到stringToSign。请注意,这只是一个简单的示例,实际使用中可能需要处理更多的细节和错误情况
原文地址: https://www.cveoy.top/t/topic/ibM5 著作权归作者所有。请勿转载和采集!