Skip to content

Commit 35247b5

Browse files
committed
fix(credential-providers): supply backup credentials to fromTemporaryCredentials
1 parent d35e4ad commit 35247b5

File tree

2 files changed

+35
-5
lines changed

2 files changed

+35
-5
lines changed

packages/credential-providers/src/fromTemporaryCredentials.ts

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import type { AssumeRoleCommandInput, STSClient, STSClientConfig } from "@aws-sdk/nested-clients/sts";
2-
import type { CredentialProviderOptions } from "@aws-sdk/types";
2+
import type {
3+
AwsIdentityProperties,
4+
CredentialProviderOptions,
5+
RuntimeConfigAwsCredentialIdentityProvider,
6+
} from "@aws-sdk/types";
37
import { CredentialsProviderError } from "@smithy/property-provider";
48
import { AwsCredentialIdentity, AwsCredentialIdentityProvider, Pluggable } from "@smithy/types";
59

@@ -53,9 +57,11 @@ export interface FromTemporaryCredentialsOptions extends CredentialProviderOptio
5357
*
5458
* @public
5559
*/
56-
export const fromTemporaryCredentials = (options: FromTemporaryCredentialsOptions): AwsCredentialIdentityProvider => {
60+
export const fromTemporaryCredentials = (
61+
options: FromTemporaryCredentialsOptions
62+
): RuntimeConfigAwsCredentialIdentityProvider => {
5763
let stsClient: STSClient;
58-
return async (): Promise<AwsCredentialIdentity> => {
64+
return async (awsIdentityProperties: AwsIdentityProperties = {}): Promise<AwsCredentialIdentity> => {
5965
options.logger?.debug("@aws-sdk/credential-providers - fromTemporaryCredentials (STS)");
6066
const params = { ...options.params, RoleSessionName: options.params.RoleSessionName ?? "aws-sdk-js-" + Date.now() };
6167
if (params?.SerialNumber) {
@@ -73,7 +79,26 @@ export const fromTemporaryCredentials = (options: FromTemporaryCredentialsOption
7379

7480
const { AssumeRoleCommand, STSClient } = await import("./loadSts");
7581

76-
if (!stsClient) stsClient = new STSClient({ ...options.clientConfig, credentials: options.masterCredentials });
82+
if (!stsClient) {
83+
const defaultCredentialsOrError = async () => {
84+
if (stsClient.config.runtime === "node") {
85+
const { fromNodeProviderChain } = await import("./fromNodeProviderChain");
86+
return fromNodeProviderChain({})();
87+
}
88+
throw new CredentialsProviderError(
89+
"@aws-sdk/credential-providers::fromTemporaryCredentials - no default credentials found, masterCredentials needed to call fromTemporaryCredentials().",
90+
{
91+
logger: options.logger,
92+
}
93+
);
94+
};
95+
const { callerClientConfig } = awsIdentityProperties;
96+
stsClient = new STSClient({
97+
...options.clientConfig,
98+
credentials:
99+
options.masterCredentials ?? callerClientConfig?.credentialDefaultProvider?.() ?? defaultCredentialsOrError,
100+
});
101+
}
77102
if (options.clientPlugins) {
78103
for (const plugin of options.clientPlugins) {
79104
stsClient.middlewareStack.use(plugin);

packages/types/src/identity/AwsCredentialIdentity.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { AwsCredentialIdentity } from "@smithy/types";
1+
import type { AwsCredentialIdentity, AwsCredentialIdentityProvider } from "@smithy/types";
22

33
import type { AwsSdkCredentialsFeatures } from "../feature-ids";
44

@@ -11,6 +11,11 @@ export interface AwsIdentityProperties {
1111
callerClientConfig?: {
1212
region(): Promise<string>;
1313
profile?: string;
14+
/**
15+
* @internal
16+
* @deprecated
17+
*/
18+
credentialDefaultProvider?: (input?: any) => AwsCredentialIdentityProvider;
1419
};
1520
}
1621

0 commit comments

Comments
 (0)