Skip to content

Commit a65995f

Browse files
kuhetrivikr
andauthored
feat(credential-providers): make credential providers aware of caller client region (#6726)
* feat(credential-providers): make credential providers aware of contextual client region * chore: update lockfile * test(credential-provider-node): additional integ tests for cognito * feat(credential-providers): fix tests, add chaining support * feat(credential-providers): rename contextClientConfig to callerClientConfig * Update packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.ts Co-authored-by: Trivikram Kamat <[email protected]> * test: unit test fixes * feat(credential-providers): rename types --------- Co-authored-by: Trivikram Kamat <[email protected]>
1 parent 041a906 commit a65995f

File tree

22 files changed

+666
-82
lines changed

22 files changed

+666
-82
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"copy-models": "node ./scripts/copy-models",
2525
"extract:docs": "node ./scripts/extract-docs/index.js",
2626
"g:vitest": "cd $INIT_CWD && vitest",
27+
"g:jest": "cd $INIT_CWD && jest",
2728
"generate-clients": "node ./scripts/generate-clients",
2829
"generate:clients:generic": "node ./scripts/generate-clients/generic",
2930
"generate:defaults-mode-provider": "./scripts/generate-defaults-mode-provider/index.js",

packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.ts

+11-9
Original file line numberDiff line numberDiff line change
@@ -106,29 +106,31 @@ export const resolveAwsSdkSigV4Config = <T>(
106106
): T & AwsSdkSigV4AuthResolvedConfig => {
107107
let isUserSupplied = false;
108108
// Normalize credentials
109-
let normalizedCreds: AwsCredentialIdentityProvider | undefined;
109+
let credentialsProvider: AwsCredentialIdentityProvider | undefined;
110110
if (config.credentials) {
111111
isUserSupplied = true;
112-
normalizedCreds = memoizeIdentityProvider(config.credentials, isIdentityExpired, doesIdentityRequireRefresh);
112+
credentialsProvider = memoizeIdentityProvider(config.credentials, isIdentityExpired, doesIdentityRequireRefresh);
113113
}
114-
if (!normalizedCreds) {
114+
if (!credentialsProvider) {
115115
// credentialDefaultProvider should always be populated, but in case
116116
// it isn't, set a default identity provider that throws an error
117117
if (config.credentialDefaultProvider) {
118-
normalizedCreds = normalizeProvider(
118+
credentialsProvider = normalizeProvider(
119119
config.credentialDefaultProvider(
120120
Object.assign({}, config as any, {
121121
parentClientConfig: config,
122122
})
123123
)
124124
);
125125
} else {
126-
normalizedCreds = async () => {
126+
credentialsProvider = async () => {
127127
throw new Error("`credentials` is missing");
128128
};
129129
}
130130
}
131131

132+
const boundCredentialsProvider = async () => credentialsProvider!({ callerClientConfig: config });
133+
132134
// Populate sigv4 arguments
133135
const {
134136
// Default for signingEscapePath
@@ -170,7 +172,7 @@ export const resolveAwsSdkSigV4Config = <T>(
170172

171173
const params: SignatureV4Init & SignatureV4CryptoInit = {
172174
...config,
173-
credentials: normalizedCreds!,
175+
credentials: boundCredentialsProvider,
174176
region: config.signingRegion,
175177
service: config.signingName,
176178
sha256,
@@ -206,7 +208,7 @@ export const resolveAwsSdkSigV4Config = <T>(
206208

207209
const params: SignatureV4Init & SignatureV4CryptoInit = {
208210
...config,
209-
credentials: normalizedCreds!,
211+
credentials: boundCredentialsProvider,
210212
region: config.signingRegion,
211213
service: config.signingName,
212214
sha256,
@@ -224,10 +226,10 @@ export const resolveAwsSdkSigV4Config = <T>(
224226
signingEscapePath,
225227
credentials: isUserSupplied
226228
? async () =>
227-
normalizedCreds!().then((creds: AttributedAwsCredentialIdentity) =>
229+
boundCredentialsProvider!().then((creds: AttributedAwsCredentialIdentity) =>
228230
setCredentialFeature(creds, "CREDENTIALS_CODE", "e")
229231
)
230-
: normalizedCreds!,
232+
: boundCredentialsProvider!,
231233
signer,
232234
};
233235
};

packages/credential-provider-cognito-identity/src/fromCognitoIdentity.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import type { CredentialProviderOptions } from "@aws-sdk/types";
1+
import type { AwsIdentityProperties, CredentialProviderOptions, RuntimeConfigIdentityProvider } from "@aws-sdk/types";
22
import { CredentialsProviderError } from "@smithy/property-provider";
3-
import { AwsCredentialIdentity, Logger, Provider } from "@smithy/types";
3+
import type { AwsCredentialIdentity, Logger } from "@smithy/types";
44

55
import { CognitoProviderParameters } from "./CognitoProviderParameters";
66
import { resolveLogins } from "./resolveLogins";
@@ -18,7 +18,7 @@ export interface CognitoIdentityCredentials extends AwsCredentialIdentity {
1818
/**
1919
* @internal
2020
*/
21-
export type CognitoIdentityCredentialProvider = Provider<CognitoIdentityCredentials>;
21+
export type CognitoIdentityCredentialProvider = RuntimeConfigIdentityProvider<CognitoIdentityCredentials>;
2222

2323
/**
2424
* @internal
@@ -29,7 +29,7 @@ export type CognitoIdentityCredentialProvider = Provider<CognitoIdentityCredenti
2929
* Results from this function call are not cached internally.
3030
*/
3131
export function fromCognitoIdentity(parameters: FromCognitoIdentityParameters): CognitoIdentityCredentialProvider {
32-
return async (): Promise<CognitoIdentityCredentials> => {
32+
return async (awsIdentityProperties?: AwsIdentityProperties): Promise<CognitoIdentityCredentials> => {
3333
parameters.logger?.debug("@aws-sdk/credential-provider-cognito-identity - fromCognitoIdentity");
3434
const { GetCredentialsForIdentityCommand, CognitoIdentityClient } = await import("./loadCognitoIdentity");
3535

@@ -44,7 +44,10 @@ export function fromCognitoIdentity(parameters: FromCognitoIdentityParameters):
4444
parameters.client ??
4545
new CognitoIdentityClient(
4646
Object.assign({}, parameters.clientConfig ?? {}, {
47-
region: parameters.clientConfig?.region ?? parameters.parentClientConfig?.region,
47+
region:
48+
parameters.clientConfig?.region ??
49+
parameters.parentClientConfig?.region ??
50+
awsIdentityProperties?.callerClientConfig?.region,
4851
})
4952
)
5053
).send(

packages/credential-provider-cognito-identity/src/fromCognitoIdentityPool.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { CredentialProviderOptions } from "@aws-sdk/types";
1+
import type { AwsIdentityProperties, CredentialProviderOptions } from "@aws-sdk/types";
22
import { CredentialsProviderError } from "@smithy/property-provider";
33
import { Logger } from "@smithy/types";
44

@@ -35,12 +35,15 @@ export function fromCognitoIdentityPool({
3535
? `aws:cognito-identity-credentials:${identityPoolId}:${userIdentifier}`
3636
: undefined;
3737

38-
let provider: CognitoIdentityCredentialProvider = async () => {
38+
let provider: CognitoIdentityCredentialProvider = async (awsIdentityProperties?: AwsIdentityProperties) => {
3939
const { GetIdCommand, CognitoIdentityClient } = await import("./loadCognitoIdentity");
4040
const _client =
4141
client ??
4242
new CognitoIdentityClient(
43-
Object.assign({}, clientConfig ?? {}, { region: clientConfig?.region ?? parentClientConfig?.region })
43+
Object.assign({}, clientConfig ?? {}, {
44+
region:
45+
clientConfig?.region ?? parentClientConfig?.region ?? awsIdentityProperties?.callerClientConfig?.region,
46+
})
4447
);
4548

4649
let identityId: string | undefined = (cacheKey && (await cache.getItem(cacheKey))) as string | undefined;
@@ -65,11 +68,11 @@ export function fromCognitoIdentityPool({
6568
identityId,
6669
});
6770

68-
return provider();
71+
return provider(awsIdentityProperties);
6972
};
7073

71-
return () =>
72-
provider().catch(async (err) => {
74+
return (awsIdentityProperties?: AwsIdentityProperties) =>
75+
provider(awsIdentityProperties).catch(async (err) => {
7376
if (cacheKey) {
7477
Promise.resolve(cache.removeItem(cacheKey)).catch(() => {});
7578
}

packages/credential-provider-ini/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
"build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4",
1414
"clean": "rimraf ./dist-* && rimraf *.tsbuildinfo",
1515
"test": "yarn g:vitest run",
16-
"test:watch": "yarn g:vitest watch"
16+
"test:watch": "yarn g:vitest watch",
17+
"test:integration": "yarn g:vitest run -c vitest.config.integ.ts",
18+
"test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.ts"
1719
},
1820
"keywords": [
1921
"aws",

0 commit comments

Comments
 (0)