buildSignedGetParams method
Returns a SignedRequestParams object containing the uri and the HTTP headers needed to do a signed GET request to AWS S3. Does not actually execute a request. You can use this method to integrate this client with an HTTP client of your choice.
Implementation
SignedRequestParams buildSignedGetParams(
{required String key, Map<String, String>? queryParams}) {
final unencodedPath = "$_bucketId/$key";
final uri = Uri.https(_host, unencodedPath, queryParams);
final payload = SigV4.hashCanonicalRequest('');
final datetime = SigV4.generateDatetime();
final credentialScope =
SigV4.buildCredentialScope(datetime, _region, _service);
final canonicalQuery = SigV4.buildCanonicalQueryString(queryParams);
final canonicalRequest = '''GET
${'/$unencodedPath'.split('/').map(Uri.encodeComponent).join('/')}
$canonicalQuery
host:$_host
x-amz-content-sha256:$payload
x-amz-date:$datetime
x-amz-security-token:${_sessionToken ?? ""}
host;x-amz-content-sha256;x-amz-date;x-amz-security-token
$payload''';
final stringToSign = SigV4.buildStringToSign(datetime, credentialScope,
SigV4.hashCanonicalRequest(canonicalRequest));
final signingKey =
SigV4.calculateSigningKey(_secretKey, datetime, _region, _service);
final signature = SigV4.calculateSignature(signingKey, stringToSign);
final authorization = [
'AWS4-HMAC-SHA256 Credential=$_accessKey/$credentialScope',
'SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token',
'Signature=$signature',
].join(',');
return SignedRequestParams(uri, {
'Authorization': authorization,
'x-amz-content-sha256': payload,
'x-amz-date': datetime,
});
}