createAWS4Header method
Implementation
Map<String, String> createAWS4Header(dynamic credentials, Map<String, dynamic> payload, [String? datetime]) {
final accessKeyId = credentials['Credentials']['AccessKeyId'];
final secretKey = credentials['Credentials']['SecretKey'];
final sessionToken = credentials['Credentials']['SessionToken'];
datetime ??= getDateTime();
Map<String, String> headers = {
'accept': 'application/json',
'content-type': 'application/x-amz-json-1.1; charset=utf-8',
'host': 'ssm.$region.amazonaws.com',
'x-amz-date': datetime,
'x-amz-target': 'AmazonSSM.GetParameters'
};
final canonicalRequest = [
'POST',
'/',
'',
headers.map((key, value) => MapEntry(key, '$key:$value')).values.join('\n') + '\n',
headers.keys.join(';'),
hex.encode(sha256.convert(utf8.encode(json.encode(payload))).bytes)
].join('\n');
final hashedCanonicalRequest = hex.encode(sha256.convert(utf8.encode(canonicalRequest)).bytes);
final credentialScope = '${datetime.substring(0, 8)}/$region/ssm/aws4_request';
final stringToSign = ['AWS4-HMAC-SHA256', datetime, credentialScope, hashedCanonicalRequest].join('\n');
final signingKey = _sign(
_sign(_sign(_sign(utf8.encode('AWS4$secretKey'), datetime.substring(0, 8)), region), 'ssm'), 'aws4_request');
final signature = hex.encode(_sign(signingKey, stringToSign));
headers['Authorization'] = [
'AWS4-HMAC-SHA256',
' Credential=',
accessKeyId,
'/',
credentialScope,
', SignedHeaders=',
headers.keys.join(';'),
', Signature=',
signature
].join();
headers['x-amz-security-token'] = sessionToken;
return headers;
}