buildSignedGetParams method

SignedRequestParams buildSignedGetParams({
  1. required String key,
  2. Map<String, String>? queryParams,
})

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,
  });
}