@aws-amplify/core 5.2.1-unstable.eca5078.2 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Platform/version.d.ts +1 -1
- package/lib/Platform/version.js +1 -1
- package/lib/Platform/version.js.map +1 -1
- package/lib/Signer.d.ts +1 -1
- package/lib/Signer.js +59 -256
- package/lib/Signer.js.map +1 -1
- package/lib/clients/middleware/signing/signer/signatureV4/constants.d.ts +17 -0
- package/lib/clients/middleware/signing/signer/signatureV4/constants.js +26 -0
- package/lib/clients/middleware/signing/signer/signatureV4/constants.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/index.d.ts +3 -0
- package/lib/clients/middleware/signing/signer/signatureV4/index.js +12 -0
- package/lib/clients/middleware/signing/signer/signatureV4/index.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/index.native.d.ts +4 -0
- package/lib/clients/middleware/signing/signer/signatureV4/index.native.js +13 -0
- package/lib/clients/middleware/signing/signer/signatureV4/index.native.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/presignUrl.d.ts +9 -0
- package/lib/clients/middleware/signing/signer/signatureV4/presignUrl.js +40 -0
- package/lib/clients/middleware/signing/signer/signatureV4/presignUrl.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/signRequest.d.ts +10 -0
- package/lib/clients/middleware/signing/signer/signatureV4/signRequest.js +36 -0
- package/lib/clients/middleware/signing/signer/signatureV4/signRequest.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/types/index.d.ts +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/types/index.js +5 -0
- package/lib/clients/middleware/signing/signer/signatureV4/types/index.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/types/signer.d.ts +20 -0
- package/lib/clients/middleware/signing/signer/signatureV4/types/signer.js +5 -0
- package/lib/clients/middleware/signing/signer/signatureV4/types/signer.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.d.ts +18 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.js +35 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.d.ts +12 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.js +31 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.d.ts +12 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.js +39 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.d.ts +16 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.js +35 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.d.ts +10 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.js +17 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.d.ts +12 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.js +18 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.d.ts +12 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.js +22 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.d.ts +10 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.js +35 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignature.d.ts +13 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignature.js +31 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignature.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.d.ts +10 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.js +20 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.d.ts +13 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.js +27 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.d.ts +11 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.js +34 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.js.map +1 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.d.ts +16 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.js +24 -0
- package/lib/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.js.map +1 -0
- package/lib/clients/types/aws.d.ts +2 -0
- package/lib/clients/types/aws.js +5 -0
- package/lib/clients/types/aws.js.map +1 -0
- package/lib/clients/types/core.d.ts +13 -0
- package/lib/clients/types/core.js +5 -0
- package/lib/clients/types/core.js.map +1 -0
- package/lib/clients/types/http.d.ts +26 -0
- package/lib/clients/types/http.js +5 -0
- package/lib/clients/types/http.js.map +1 -0
- package/lib/clients/types/index.d.ts +2 -0
- package/lib/clients/types/index.js +5 -0
- package/lib/clients/types/index.js.map +1 -0
- package/lib-esm/Platform/version.d.ts +1 -1
- package/lib-esm/Platform/version.js +1 -1
- package/lib-esm/Platform/version.js.map +1 -1
- package/lib-esm/Signer.d.ts +1 -1
- package/lib-esm/Signer.js +60 -257
- package/lib-esm/Signer.js.map +1 -1
- package/lib-esm/clients/middleware/signing/signer/signatureV4/constants.d.ts +17 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/constants.js +24 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/constants.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/index.d.ts +3 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/index.js +7 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/index.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/index.native.d.ts +4 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/index.native.js +8 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/index.native.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/presignUrl.d.ts +9 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/presignUrl.js +38 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/presignUrl.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/signRequest.d.ts +10 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/signRequest.js +34 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/signRequest.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/types/index.d.ts +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/types/index.js +3 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/types/index.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/types/signer.d.ts +20 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/types/signer.js +3 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/types/signer.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.d.ts +18 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.js +33 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.d.ts +12 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.js +29 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.d.ts +12 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.js +37 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.d.ts +16 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.js +33 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.d.ts +10 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.js +15 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.d.ts +12 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.js +16 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.d.ts +12 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.js +20 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.d.ts +10 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.js +33 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignature.d.ts +13 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignature.js +29 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignature.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.d.ts +10 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.js +18 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.d.ts +13 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.js +25 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.d.ts +11 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.js +32 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.js.map +1 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.d.ts +16 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.js +22 -0
- package/lib-esm/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.js.map +1 -0
- package/lib-esm/clients/types/aws.d.ts +2 -0
- package/lib-esm/clients/types/aws.js +3 -0
- package/lib-esm/clients/types/aws.js.map +1 -0
- package/lib-esm/clients/types/core.d.ts +13 -0
- package/lib-esm/clients/types/core.js +3 -0
- package/lib-esm/clients/types/core.js.map +1 -0
- package/lib-esm/clients/types/http.d.ts +26 -0
- package/lib-esm/clients/types/http.js +3 -0
- package/lib-esm/clients/types/http.js.map +1 -0
- package/lib-esm/clients/types/index.d.ts +2 -0
- package/lib-esm/clients/types/index.js +3 -0
- package/lib-esm/clients/types/index.js.map +1 -0
- package/package.json +6 -2
- package/src/Platform/version.ts +1 -1
- package/src/Signer.ts +89 -344
- package/src/clients/middleware/signing/signer/signatureV4/constants.ts +28 -0
- package/src/clients/middleware/signing/signer/signatureV4/index.native.ts +9 -0
- package/src/clients/middleware/signing/signer/signatureV4/index.ts +7 -0
- package/src/clients/middleware/signing/signer/signatureV4/presignUrl.ts +59 -0
- package/src/clients/middleware/signing/signer/signatureV4/signRequest.ts +51 -0
- package/src/clients/middleware/signing/signer/signatureV4/types/index.ts +4 -0
- package/src/clients/middleware/signing/signer/signatureV4/types/signer.ts +31 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/dataHashHelpers.ts +42 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getCanonicalHeaders.ts +25 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getCanonicalQueryString.ts +32 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getCanonicalRequest.ts +38 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getCanonicalUri.ts +14 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getCredentialScope.ts +21 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getFormattedDates.ts +22 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getHashedPayload.ts +38 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getSignature.ts +52 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getSignedHeaders.ts +19 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getSigningKey.ts +31 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getSigningValues.ts +43 -0
- package/src/clients/middleware/signing/signer/signatureV4/utils/getStringToSign.ts +28 -0
- package/src/clients/types/aws.ts +6 -0
- package/src/clients/types/core.ts +17 -0
- package/src/clients/types/http.ts +33 -0
- package/src/clients/types/index.ts +5 -0
package/src/Signer.ts
CHANGED
|
@@ -1,238 +1,16 @@
|
|
|
1
1
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
-
import { ConsoleLogger as Logger } from './Logger';
|
|
5
|
-
import { Sha256 as jsSha256 } from '@aws-crypto/sha256-js';
|
|
6
|
-
import { toHex } from '@aws-sdk/util-hex-encoding';
|
|
7
|
-
import { parse, format } from 'url';
|
|
8
4
|
import { DateUtils } from './Util';
|
|
5
|
+
import {
|
|
6
|
+
presignUrl,
|
|
7
|
+
signRequest,
|
|
8
|
+
TOKEN_QUERY_PARAM,
|
|
9
|
+
} from './clients/middleware/signing/signer/signatureV4';
|
|
9
10
|
|
|
10
|
-
const logger = new Logger('Signer');
|
|
11
|
-
|
|
12
|
-
const DEFAULT_ALGORITHM = 'AWS4-HMAC-SHA256';
|
|
13
11
|
const IOT_SERVICE_NAME = 'iotdevicegateway';
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const hash = new jsSha256(key);
|
|
17
|
-
hash.update(src);
|
|
18
|
-
return hash.digestSync();
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const hash = function(src) {
|
|
22
|
-
const arg = src || '';
|
|
23
|
-
const hash = new jsSha256();
|
|
24
|
-
hash.update(arg);
|
|
25
|
-
return toHex(hash.digestSync());
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @private
|
|
30
|
-
* RFC 3986 compliant version of encodeURIComponent
|
|
31
|
-
*/
|
|
32
|
-
const escape_RFC3986 = function(component) {
|
|
33
|
-
return component.replace(/[!'()*]/g, function(c) {
|
|
34
|
-
return '%' + c.charCodeAt(0).toString(16).toUpperCase();
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* @private
|
|
40
|
-
* Create canonical query string
|
|
41
|
-
*
|
|
42
|
-
*/
|
|
43
|
-
const canonical_query = function(query) {
|
|
44
|
-
if (!query || query.length === 0) {
|
|
45
|
-
return '';
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return query
|
|
49
|
-
.split('&')
|
|
50
|
-
.map(e => {
|
|
51
|
-
const key_val = e.split('=');
|
|
52
|
-
|
|
53
|
-
if (key_val.length === 1) {
|
|
54
|
-
return e;
|
|
55
|
-
} else {
|
|
56
|
-
const reencoded_val = escape_RFC3986(key_val[1]);
|
|
57
|
-
return key_val[0] + '=' + reencoded_val;
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
.sort((a, b) => {
|
|
61
|
-
const key_a = a.split('=')[0];
|
|
62
|
-
const key_b = b.split('=')[0];
|
|
63
|
-
if (key_a === key_b) {
|
|
64
|
-
return a < b ? -1 : 1;
|
|
65
|
-
} else {
|
|
66
|
-
return key_a < key_b ? -1 : 1;
|
|
67
|
-
}
|
|
68
|
-
})
|
|
69
|
-
.join('&');
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* @private
|
|
74
|
-
* Create canonical headers
|
|
75
|
-
*
|
|
76
|
-
<pre>
|
|
77
|
-
CanonicalHeaders =
|
|
78
|
-
CanonicalHeadersEntry0 + CanonicalHeadersEntry1 + ... + CanonicalHeadersEntryN
|
|
79
|
-
CanonicalHeadersEntry =
|
|
80
|
-
Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'
|
|
81
|
-
</pre>
|
|
82
|
-
*/
|
|
83
|
-
const canonical_headers = function(headers) {
|
|
84
|
-
if (!headers || Object.keys(headers).length === 0) {
|
|
85
|
-
return '';
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return (
|
|
89
|
-
Object.keys(headers)
|
|
90
|
-
.map(function(key) {
|
|
91
|
-
return {
|
|
92
|
-
key: key.toLowerCase(),
|
|
93
|
-
value: headers[key] ? headers[key].trim().replace(/\s+/g, ' ') : '',
|
|
94
|
-
};
|
|
95
|
-
})
|
|
96
|
-
.sort(function(a, b) {
|
|
97
|
-
return a.key < b.key ? -1 : 1;
|
|
98
|
-
})
|
|
99
|
-
.map(function(item) {
|
|
100
|
-
return item.key + ':' + item.value;
|
|
101
|
-
})
|
|
102
|
-
.join('\n') + '\n'
|
|
103
|
-
);
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* List of header keys included in the canonical headers.
|
|
108
|
-
* @access private
|
|
109
|
-
*/
|
|
110
|
-
const signed_headers = function(headers) {
|
|
111
|
-
return Object.keys(headers)
|
|
112
|
-
.map(function(key) {
|
|
113
|
-
return key.toLowerCase();
|
|
114
|
-
})
|
|
115
|
-
.sort()
|
|
116
|
-
.join(';');
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* @private
|
|
121
|
-
* Create canonical request
|
|
122
|
-
* Refer to
|
|
123
|
-
* {@link http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html|Create a Canonical Request}
|
|
124
|
-
*
|
|
125
|
-
<pre>
|
|
126
|
-
CanonicalRequest =
|
|
127
|
-
HTTPRequestMethod + '\n' +
|
|
128
|
-
CanonicalURI + '\n' +
|
|
129
|
-
CanonicalQueryString + '\n' +
|
|
130
|
-
CanonicalHeaders + '\n' +
|
|
131
|
-
SignedHeaders + '\n' +
|
|
132
|
-
HexEncode(Hash(RequestPayload))
|
|
133
|
-
</pre>
|
|
134
|
-
*/
|
|
135
|
-
const canonical_request = function(request) {
|
|
136
|
-
const url_info = parse(request.url);
|
|
137
|
-
|
|
138
|
-
return [
|
|
139
|
-
request.method || '/',
|
|
140
|
-
encodeURIComponent(url_info.pathname).replace(/%2F/gi, '/'),
|
|
141
|
-
canonical_query(url_info.query),
|
|
142
|
-
canonical_headers(request.headers),
|
|
143
|
-
signed_headers(request.headers),
|
|
144
|
-
hash(request.data),
|
|
145
|
-
].join('\n');
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
const parse_service_info = function(request) {
|
|
149
|
-
const url_info = parse(request.url),
|
|
150
|
-
host = url_info.host;
|
|
151
|
-
|
|
152
|
-
const matched = host.match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com$/);
|
|
153
|
-
let parsed = (matched || []).slice(1, 3);
|
|
154
|
-
|
|
155
|
-
if (parsed[1] === 'es') {
|
|
156
|
-
// Elastic Search
|
|
157
|
-
parsed = parsed.reverse();
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return {
|
|
161
|
-
service: request.service || parsed[0],
|
|
162
|
-
region: request.region || parsed[1],
|
|
163
|
-
};
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
const credential_scope = function(d_str, region, service) {
|
|
167
|
-
return [d_str, region, service, 'aws4_request'].join('/');
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* @private
|
|
172
|
-
* Create a string to sign
|
|
173
|
-
* Refer to
|
|
174
|
-
* {@link http://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html|Create String to Sign}
|
|
175
|
-
*
|
|
176
|
-
<pre>
|
|
177
|
-
StringToSign =
|
|
178
|
-
Algorithm + \n +
|
|
179
|
-
RequestDateTime + \n +
|
|
180
|
-
CredentialScope + \n +
|
|
181
|
-
HashedCanonicalRequest
|
|
182
|
-
</pre>
|
|
183
|
-
*/
|
|
184
|
-
const string_to_sign = function(algorithm, canonical_request, dt_str, scope) {
|
|
185
|
-
return [algorithm, dt_str, scope, hash(canonical_request)].join('\n');
|
|
186
|
-
};
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* @private
|
|
190
|
-
* Create signing key
|
|
191
|
-
* Refer to
|
|
192
|
-
* {@link http://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html|Calculate Signature}
|
|
193
|
-
*
|
|
194
|
-
<pre>
|
|
195
|
-
kSecret = your secret access key
|
|
196
|
-
kDate = HMAC("AWS4" + kSecret, Date)
|
|
197
|
-
kRegion = HMAC(kDate, Region)
|
|
198
|
-
kService = HMAC(kRegion, Service)
|
|
199
|
-
kSigning = HMAC(kService, "aws4_request")
|
|
200
|
-
</pre>
|
|
201
|
-
*/
|
|
202
|
-
const get_signing_key = function(secret_key, d_str, service_info) {
|
|
203
|
-
logger.debug(service_info);
|
|
204
|
-
const k = 'AWS4' + secret_key,
|
|
205
|
-
k_date = encrypt(k, d_str),
|
|
206
|
-
k_region = encrypt(k_date, service_info.region),
|
|
207
|
-
k_service = encrypt(k_region, service_info.service),
|
|
208
|
-
k_signing = encrypt(k_service, 'aws4_request');
|
|
209
|
-
|
|
210
|
-
return k_signing;
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
const get_signature = function(signing_key, str_to_sign) {
|
|
214
|
-
return toHex(encrypt(signing_key, str_to_sign));
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* @private
|
|
219
|
-
* Create authorization header
|
|
220
|
-
* Refer to
|
|
221
|
-
* {@link http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html|Add the Signing Information}
|
|
222
|
-
*/
|
|
223
|
-
const get_authorization_header = function(
|
|
224
|
-
algorithm,
|
|
225
|
-
access_key,
|
|
226
|
-
scope,
|
|
227
|
-
signed_headers,
|
|
228
|
-
signature
|
|
229
|
-
) {
|
|
230
|
-
return [
|
|
231
|
-
algorithm + ' ' + 'Credential=' + access_key + '/' + scope,
|
|
232
|
-
'SignedHeaders=' + signed_headers,
|
|
233
|
-
'Signature=' + signature,
|
|
234
|
-
].join(', ');
|
|
235
|
-
};
|
|
12
|
+
// Best practice regex to parse the service and region from an AWS endpoint
|
|
13
|
+
const AWS_ENDPOINT_REGEX = /([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com(.cn)?$/;
|
|
236
14
|
|
|
237
15
|
export class Signer {
|
|
238
16
|
/**
|
|
@@ -271,7 +49,7 @@ export class Signer {
|
|
|
271
49
|
*
|
|
272
50
|
* @returns {object} Signed HTTP request
|
|
273
51
|
*/
|
|
274
|
-
static sign(request,
|
|
52
|
+
static sign(request, accessInfo, serviceInfo) {
|
|
275
53
|
request.headers = request.headers || {};
|
|
276
54
|
|
|
277
55
|
if (request.body && !request.data) {
|
|
@@ -280,51 +58,25 @@ export class Signer {
|
|
|
280
58
|
);
|
|
281
59
|
}
|
|
282
60
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
const url_info = parse(request.url);
|
|
289
|
-
request.headers['host'] = url_info.host;
|
|
290
|
-
request.headers['x-amz-date'] = dt_str;
|
|
291
|
-
if (access_info.session_token) {
|
|
292
|
-
request.headers['X-Amz-Security-Token'] = access_info.session_token;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
// Task 1: Create a Canonical Request
|
|
296
|
-
const request_str = canonical_request(request);
|
|
297
|
-
logger.debug(request_str);
|
|
298
|
-
|
|
299
|
-
// Task 2: Create a String to Sign
|
|
300
|
-
const serviceInfo = service_info || parse_service_info(request),
|
|
301
|
-
scope = credential_scope(d_str, serviceInfo.region, serviceInfo.service),
|
|
302
|
-
str_to_sign = string_to_sign(
|
|
303
|
-
DEFAULT_ALGORITHM,
|
|
304
|
-
request_str,
|
|
305
|
-
dt_str,
|
|
306
|
-
scope
|
|
307
|
-
);
|
|
308
|
-
|
|
309
|
-
// Task 3: Calculate the Signature
|
|
310
|
-
const signing_key = get_signing_key(
|
|
311
|
-
access_info.secret_key,
|
|
312
|
-
d_str,
|
|
313
|
-
serviceInfo
|
|
314
|
-
),
|
|
315
|
-
signature = get_signature(signing_key, str_to_sign);
|
|
316
|
-
|
|
317
|
-
// Task 4: Adding the Signing information to the Request
|
|
318
|
-
const authorization_header = get_authorization_header(
|
|
319
|
-
DEFAULT_ALGORITHM,
|
|
320
|
-
access_info.access_key,
|
|
321
|
-
scope,
|
|
322
|
-
signed_headers(request.headers),
|
|
323
|
-
signature
|
|
324
|
-
);
|
|
325
|
-
request.headers['Authorization'] = authorization_header;
|
|
61
|
+
const requestToSign = {
|
|
62
|
+
...request,
|
|
63
|
+
body: request.data,
|
|
64
|
+
url: new URL(request.url as string),
|
|
65
|
+
};
|
|
326
66
|
|
|
327
|
-
|
|
67
|
+
const options = getOptions(requestToSign, accessInfo, serviceInfo);
|
|
68
|
+
const signedRequest: any = signRequest(requestToSign, options);
|
|
69
|
+
// Prior to using `signRequest`, Signer accepted urls as strings and outputted urls as string. Coerce the property
|
|
70
|
+
// back to a string so as not to disrupt consumers of Signer.
|
|
71
|
+
signedRequest.url = signedRequest.url.toString();
|
|
72
|
+
// HTTP headers should be case insensitive but, to maintain parity with the previous Signer implementation and
|
|
73
|
+
// limit the impact of this implementation swap, replace lowercased headers with title cased ones.
|
|
74
|
+
signedRequest.headers.Authorization = signedRequest.headers.authorization;
|
|
75
|
+
signedRequest.headers['X-Amz-Security-Token'] =
|
|
76
|
+
signedRequest.headers['x-amz-security-token'];
|
|
77
|
+
delete signedRequest.headers.authorization;
|
|
78
|
+
delete signedRequest.headers['x-amz-security-token'];
|
|
79
|
+
return signedRequest;
|
|
328
80
|
}
|
|
329
81
|
|
|
330
82
|
static signUrl(
|
|
@@ -352,80 +104,73 @@ export class Signer {
|
|
|
352
104
|
const body: any =
|
|
353
105
|
typeof urlOrRequest === 'object' ? urlOrRequest.body : undefined;
|
|
354
106
|
|
|
355
|
-
const
|
|
356
|
-
|
|
357
|
-
.replace(/[:\-]|\.\d{3}/g, '');
|
|
358
|
-
const today = now.substr(0, 8);
|
|
359
|
-
// Intentionally discarding search
|
|
360
|
-
const { search, ...parsedUrl } = parse(urlToSign, true, true);
|
|
361
|
-
const { host } = parsedUrl;
|
|
362
|
-
const signedHeaders = { host };
|
|
363
|
-
|
|
364
|
-
const { region, service } =
|
|
365
|
-
serviceInfo || parse_service_info({ url: format(parsedUrl) });
|
|
366
|
-
const credentialScope = credential_scope(today, region, service);
|
|
367
|
-
|
|
368
|
-
// IoT service does not allow the session token in the canonical request
|
|
369
|
-
// https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html
|
|
370
|
-
const sessionTokenRequired =
|
|
371
|
-
accessInfo.session_token && service !== IOT_SERVICE_NAME;
|
|
372
|
-
const queryParams = {
|
|
373
|
-
'X-Amz-Algorithm': DEFAULT_ALGORITHM,
|
|
374
|
-
'X-Amz-Credential': [accessInfo.access_key, credentialScope].join('/'),
|
|
375
|
-
'X-Amz-Date': now.substr(0, 16),
|
|
376
|
-
...(sessionTokenRequired
|
|
377
|
-
? { 'X-Amz-Security-Token': `${accessInfo.session_token}` }
|
|
378
|
-
: {}),
|
|
379
|
-
...(expiration ? { 'X-Amz-Expires': `${expiration}` } : {}),
|
|
380
|
-
'X-Amz-SignedHeaders': Object.keys(signedHeaders).join(','),
|
|
381
|
-
};
|
|
382
|
-
|
|
383
|
-
const canonicalRequest = canonical_request({
|
|
107
|
+
const presignable = {
|
|
108
|
+
body,
|
|
384
109
|
method,
|
|
385
|
-
url:
|
|
386
|
-
|
|
387
|
-
query: {
|
|
388
|
-
...parsedUrl.query,
|
|
389
|
-
...queryParams,
|
|
390
|
-
},
|
|
391
|
-
}),
|
|
392
|
-
headers: signedHeaders,
|
|
393
|
-
data: body,
|
|
394
|
-
});
|
|
110
|
+
url: new URL(urlToSign),
|
|
111
|
+
};
|
|
395
112
|
|
|
396
|
-
const
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
113
|
+
const options = getOptions(
|
|
114
|
+
presignable,
|
|
115
|
+
accessInfo,
|
|
116
|
+
serviceInfo,
|
|
117
|
+
expiration
|
|
401
118
|
);
|
|
119
|
+
const signedUrl = presignUrl(presignable, options);
|
|
120
|
+
if (
|
|
121
|
+
accessInfo.session_token &&
|
|
122
|
+
!sessionTokenRequiredInSigning(options.signingService)
|
|
123
|
+
) {
|
|
124
|
+
signedUrl.searchParams.append(
|
|
125
|
+
TOKEN_QUERY_PARAM,
|
|
126
|
+
accessInfo.session_token
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
return signedUrl.toString();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
402
132
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
}
|
|
414
|
-
|
|
133
|
+
const getOptions = (request, accessInfo, serviceInfo, expiration?) => {
|
|
134
|
+
const { access_key, secret_key, session_token } = accessInfo ?? {};
|
|
135
|
+
const { region: urlRegion, service: urlService } = parseServiceInfo(
|
|
136
|
+
request.url
|
|
137
|
+
);
|
|
138
|
+
const { region = urlRegion, service = urlService } = serviceInfo ?? {};
|
|
139
|
+
const credentials = {
|
|
140
|
+
accessKeyId: access_key,
|
|
141
|
+
secretAccessKey: secret_key,
|
|
142
|
+
...(sessionTokenRequiredInSigning(service)
|
|
143
|
+
? { sessionToken: session_token }
|
|
144
|
+
: {}),
|
|
145
|
+
};
|
|
146
|
+
return {
|
|
147
|
+
credentials,
|
|
148
|
+
signingDate: DateUtils.getDateWithClockOffset(),
|
|
149
|
+
signingRegion: region,
|
|
150
|
+
signingService: service,
|
|
151
|
+
...(expiration && { expiration }),
|
|
152
|
+
};
|
|
153
|
+
};
|
|
415
154
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
pathname: parsedUrl.pathname,
|
|
422
|
-
query: {
|
|
423
|
-
...parsedUrl.query,
|
|
424
|
-
...queryParams,
|
|
425
|
-
...additionalQueryParams,
|
|
426
|
-
},
|
|
427
|
-
});
|
|
155
|
+
// TODO: V6 investigate whether add to custom clients' general signer implementation.
|
|
156
|
+
const parseServiceInfo = (url: URL) => {
|
|
157
|
+
const host = url.host;
|
|
158
|
+
const matched = host.match(AWS_ENDPOINT_REGEX) ?? [];
|
|
159
|
+
let parsed = matched.slice(1, 3);
|
|
428
160
|
|
|
429
|
-
|
|
161
|
+
if (parsed[1] === 'es') {
|
|
162
|
+
// Elastic Search
|
|
163
|
+
parsed = parsed.reverse();
|
|
430
164
|
}
|
|
431
|
-
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
service: parsed[0],
|
|
168
|
+
region: parsed[1],
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
// IoT service does not allow the session token in the canonical request
|
|
173
|
+
// https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html
|
|
174
|
+
// TODO: V6 investigate whether add to custom clients' general signer implementation.
|
|
175
|
+
const sessionTokenRequiredInSigning = (service: string) =>
|
|
176
|
+
service !== IOT_SERVICE_NAME;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// query params
|
|
5
|
+
export const ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm';
|
|
6
|
+
export const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date';
|
|
7
|
+
export const CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential';
|
|
8
|
+
export const EXPIRES_QUERY_PARAM = 'X-Amz-Expires';
|
|
9
|
+
export const REGION_SET_PARAM = 'X-Amz-Region-Set';
|
|
10
|
+
export const SIGNATURE_QUERY_PARAM = 'X-Amz-Signature';
|
|
11
|
+
export const SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders';
|
|
12
|
+
export const TOKEN_QUERY_PARAM = 'X-Amz-Security-Token';
|
|
13
|
+
|
|
14
|
+
// headers
|
|
15
|
+
export const AUTH_HEADER = 'authorization';
|
|
16
|
+
export const HOST_HEADER = 'host';
|
|
17
|
+
export const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase();
|
|
18
|
+
export const TOKEN_HEADER = TOKEN_QUERY_PARAM.toLowerCase();
|
|
19
|
+
|
|
20
|
+
// identifiers
|
|
21
|
+
export const KEY_TYPE_IDENTIFIER = 'aws4_request';
|
|
22
|
+
export const SHA256_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256';
|
|
23
|
+
export const SIGNATURE_IDENTIFIER = 'AWS4';
|
|
24
|
+
|
|
25
|
+
// preset values
|
|
26
|
+
export const EMPTY_HASH =
|
|
27
|
+
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
|
|
28
|
+
export const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import 'react-native-url-polyfill/auto';
|
|
5
|
+
|
|
6
|
+
// TODO: V6 replace Signer
|
|
7
|
+
export { signRequest } from './signRequest';
|
|
8
|
+
export { presignUrl } from './presignUrl';
|
|
9
|
+
export { TOKEN_QUERY_PARAM } from './constants';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// TODO: V6 replace Signer
|
|
5
|
+
export { signRequest } from './signRequest';
|
|
6
|
+
export { presignUrl } from './presignUrl';
|
|
7
|
+
export { TOKEN_QUERY_PARAM } from './constants';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { Presignable, PresignUrlOptions } from './types';
|
|
5
|
+
import {
|
|
6
|
+
ALGORITHM_QUERY_PARAM,
|
|
7
|
+
AMZ_DATE_QUERY_PARAM,
|
|
8
|
+
CREDENTIAL_QUERY_PARAM,
|
|
9
|
+
EXPIRES_QUERY_PARAM,
|
|
10
|
+
HOST_HEADER,
|
|
11
|
+
SHA256_ALGORITHM_IDENTIFIER,
|
|
12
|
+
SIGNATURE_QUERY_PARAM,
|
|
13
|
+
SIGNED_HEADERS_QUERY_PARAM,
|
|
14
|
+
TOKEN_QUERY_PARAM,
|
|
15
|
+
} from './constants';
|
|
16
|
+
import { getSigningValues } from './utils/getSigningValues';
|
|
17
|
+
import { getSignature } from './utils/getSignature';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Given a `Presignable` object, returns a Signature Version 4 presigned `URL` object.
|
|
21
|
+
*
|
|
22
|
+
* @param presignable `Presignable` object containing at least a url to be presigned with authentication query params.
|
|
23
|
+
* @param presignUrlOptions `PresignUrlOptions` object containing values used to construct the signature.
|
|
24
|
+
* @returns A `URL` with authentication query params which can grant temporary access to AWS resources.
|
|
25
|
+
*/
|
|
26
|
+
export const presignUrl = (
|
|
27
|
+
{ body, method = 'GET', url }: Presignable,
|
|
28
|
+
{ expiration, ...options }: PresignUrlOptions
|
|
29
|
+
): URL => {
|
|
30
|
+
const signingValues = getSigningValues(options);
|
|
31
|
+
const { accessKeyId, credentialScope, longDate, sessionToken } =
|
|
32
|
+
signingValues;
|
|
33
|
+
|
|
34
|
+
// create the request to sign
|
|
35
|
+
// @ts-ignore URL constructor accepts a URL object
|
|
36
|
+
const presignedUrl = new URL(url);
|
|
37
|
+
Object.entries({
|
|
38
|
+
[ALGORITHM_QUERY_PARAM]: SHA256_ALGORITHM_IDENTIFIER,
|
|
39
|
+
[CREDENTIAL_QUERY_PARAM]: `${accessKeyId}/${credentialScope}`,
|
|
40
|
+
[AMZ_DATE_QUERY_PARAM]: longDate,
|
|
41
|
+
[SIGNED_HEADERS_QUERY_PARAM]: HOST_HEADER,
|
|
42
|
+
...(expiration && { [EXPIRES_QUERY_PARAM]: expiration.toString() }),
|
|
43
|
+
...(sessionToken && { [TOKEN_QUERY_PARAM]: sessionToken }),
|
|
44
|
+
}).forEach(([key, value]) => {
|
|
45
|
+
presignedUrl.searchParams.append(key, value);
|
|
46
|
+
});
|
|
47
|
+
const requestToSign = {
|
|
48
|
+
body,
|
|
49
|
+
headers: { [HOST_HEADER]: url.host },
|
|
50
|
+
method,
|
|
51
|
+
url: presignedUrl,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// calculate and add the signature to the url
|
|
55
|
+
const signature = getSignature(requestToSign, signingValues);
|
|
56
|
+
presignedUrl.searchParams.append(SIGNATURE_QUERY_PARAM, signature);
|
|
57
|
+
|
|
58
|
+
return presignedUrl;
|
|
59
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { HttpRequest } from '../../../../types';
|
|
5
|
+
import { SignRequestOptions } from './types/signer';
|
|
6
|
+
import { getSignedHeaders } from './utils/getSignedHeaders';
|
|
7
|
+
import { getSigningValues } from './utils/getSigningValues';
|
|
8
|
+
import {
|
|
9
|
+
AMZ_DATE_HEADER,
|
|
10
|
+
AUTH_HEADER,
|
|
11
|
+
HOST_HEADER,
|
|
12
|
+
SHA256_ALGORITHM_IDENTIFIER,
|
|
13
|
+
TOKEN_HEADER,
|
|
14
|
+
} from './constants';
|
|
15
|
+
import { getSignature } from './utils/getSignature';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Given a `HttpRequest`, returns a Signature Version 4 signed `HttpRequest`.
|
|
19
|
+
*
|
|
20
|
+
* @param request `HttpRequest` to be signed.
|
|
21
|
+
* @param signRequestOptions `SignRequestOptions` object containing values used to construct the signature.
|
|
22
|
+
* @returns A `HttpRequest` with authentication headers which can grant temporary access to AWS resources.
|
|
23
|
+
*/
|
|
24
|
+
export const signRequest = (
|
|
25
|
+
request: HttpRequest,
|
|
26
|
+
options: SignRequestOptions
|
|
27
|
+
): HttpRequest => {
|
|
28
|
+
const signingValues = getSigningValues(options);
|
|
29
|
+
const { accessKeyId, credentialScope, longDate, sessionToken } =
|
|
30
|
+
signingValues;
|
|
31
|
+
|
|
32
|
+
// create the request to sign
|
|
33
|
+
const headers = { ...request.headers };
|
|
34
|
+
headers[HOST_HEADER] = request.url.host;
|
|
35
|
+
headers[AMZ_DATE_HEADER] = longDate;
|
|
36
|
+
if (sessionToken) {
|
|
37
|
+
headers[TOKEN_HEADER] = sessionToken;
|
|
38
|
+
}
|
|
39
|
+
const requestToSign = { ...request, headers };
|
|
40
|
+
|
|
41
|
+
// calculate and add the signature to the request
|
|
42
|
+
const signature = getSignature(requestToSign, signingValues);
|
|
43
|
+
const credentialEntry = `Credential=${accessKeyId}/${credentialScope}`;
|
|
44
|
+
const signedHeadersEntry = `SignedHeaders=${getSignedHeaders(headers)}`;
|
|
45
|
+
const signatureEntry = `Signature=${signature}`;
|
|
46
|
+
headers[
|
|
47
|
+
AUTH_HEADER
|
|
48
|
+
] = `${SHA256_ALGORITHM_IDENTIFIER} ${credentialEntry}, ${signedHeadersEntry}, ${signatureEntry}`;
|
|
49
|
+
|
|
50
|
+
return requestToSign;
|
|
51
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { Credentials, HttpRequest } from '../../../../../types';
|
|
5
|
+
|
|
6
|
+
export interface SignRequestOptions {
|
|
7
|
+
credentials: Credentials;
|
|
8
|
+
signingDate?: Date;
|
|
9
|
+
signingRegion: string;
|
|
10
|
+
signingService: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface PresignUrlOptions extends SignRequestOptions {
|
|
14
|
+
expiration?: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface Presignable extends Pick<HttpRequest, 'body' | 'url'> {
|
|
18
|
+
method?: HttpRequest['method'];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface FormattedDates {
|
|
22
|
+
longDate: string;
|
|
23
|
+
shortDate: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface SigningValues
|
|
27
|
+
extends Credentials,
|
|
28
|
+
FormattedDates,
|
|
29
|
+
Pick<SignRequestOptions, 'signingRegion' | 'signingService'> {
|
|
30
|
+
credentialScope: string;
|
|
31
|
+
}
|