Skip to content

Commit 253d329

Browse files
authored
chore(id-auth-sra): S3 Express compatibility with ID & Auth SRA (#6346)
* chore(id-auth-sra): remove s3 from useLegacyAuth list * chore(client-s3): turn off useLegacyAuth * chore(client-s3): id-auth sra and regionRedirect compatibility * chore(client-s3): compatibility for S3Express and httpsigning midware
1 parent 7bf2e59 commit 253d329

File tree

20 files changed

+690
-48
lines changed

20 files changed

+690
-48
lines changed

clients/client-s3/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
"@aws-sdk/middleware-logger": "*",
3939
"@aws-sdk/middleware-recursion-detection": "*",
4040
"@aws-sdk/middleware-sdk-s3": "*",
41-
"@aws-sdk/middleware-signing": "*",
4241
"@aws-sdk/middleware-ssec": "*",
4342
"@aws-sdk/middleware-user-agent": "*",
4443
"@aws-sdk/region-config-resolver": "*",
@@ -76,6 +75,7 @@
7675
"@smithy/util-defaults-mode-browser": "^3.0.14",
7776
"@smithy/util-defaults-mode-node": "^3.0.14",
7877
"@smithy/util-endpoints": "^2.0.5",
78+
"@smithy/util-middleware": "^3.0.3",
7979
"@smithy/util-retry": "^3.0.3",
8080
"@smithy/util-stream": "^3.1.3",
8181
"@smithy/util-utf8": "^3.0.0",

clients/client-s3/src/S3Client.ts

+44-25
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,26 @@ import { getLoggerPlugin } from "@aws-sdk/middleware-logger";
1010
import { getRecursionDetectionPlugin } from "@aws-sdk/middleware-recursion-detection";
1111
import {
1212
getRegionRedirectMiddlewarePlugin,
13+
getS3ExpressHttpSigningPlugin,
1314
getS3ExpressPlugin,
1415
getValidateBucketNamePlugin,
1516
resolveS3Config,
1617
S3InputConfig,
1718
S3ResolvedConfig,
1819
} from "@aws-sdk/middleware-sdk-s3";
19-
import {
20-
AwsAuthInputConfig,
21-
AwsAuthResolvedConfig,
22-
getAwsAuthPlugin,
23-
resolveAwsAuthConfig,
24-
} from "@aws-sdk/middleware-signing";
2520
import {
2621
getUserAgentPlugin,
2722
resolveUserAgentConfig,
2823
UserAgentInputConfig,
2924
UserAgentResolvedConfig,
3025
} from "@aws-sdk/middleware-user-agent";
31-
import { Credentials as __Credentials, GetAwsChunkedEncodingStream } from "@aws-sdk/types";
26+
import { GetAwsChunkedEncodingStream } from "@aws-sdk/types";
3227
import { RegionInputConfig, RegionResolvedConfig, resolveRegionConfig } from "@smithy/config-resolver";
28+
import {
29+
DefaultIdentityProviderConfig,
30+
getHttpAuthSchemeEndpointRuleSetPlugin,
31+
getHttpSigningPlugin,
32+
} from "@smithy/core";
3333
import {
3434
EventStreamSerdeInputConfig,
3535
EventStreamSerdeResolvedConfig,
@@ -46,6 +46,7 @@ import {
4646
SmithyResolvedConfiguration as __SmithyResolvedConfiguration,
4747
} from "@smithy/smithy-client";
4848
import {
49+
AwsCredentialIdentityProvider,
4950
BodyLengthCalculator as __BodyLengthCalculator,
5051
CheckOptionalClientConfig as __CheckOptionalClientConfig,
5152
Checksum as __Checksum,
@@ -68,6 +69,12 @@ import {
6869
} from "@smithy/types";
6970
import { Readable } from "stream";
7071

72+
import {
73+
defaultS3HttpAuthSchemeParametersProvider,
74+
HttpAuthSchemeInputConfig,
75+
HttpAuthSchemeResolvedConfig,
76+
resolveHttpAuthSchemeConfig,
77+
} from "./auth/httpAuthSchemeProvider";
7178
import {
7279
AbortMultipartUploadCommandInput,
7380
AbortMultipartUploadCommandOutput,
@@ -663,19 +670,11 @@ export interface ClientDefaults extends Partial<__SmithyConfiguration<__HttpHand
663670

664671
/**
665672
* Default credentials provider; Not available in browser runtime.
673+
* @deprecated
666674
* @internal
667675
*/
668-
credentialDefaultProvider?: (input: any) => __Provider<__Credentials>;
676+
credentialDefaultProvider?: (input: any) => AwsCredentialIdentityProvider;
669677

670-
/**
671-
* Whether to escape request path when signing the request.
672-
*/
673-
signingEscapePath?: boolean;
674-
675-
/**
676-
* Whether to override the request region with the region inferred from requested resource's ARN. Defaults to false.
677-
*/
678-
useArnRegion?: boolean | Provider<boolean>;
679678
/**
680679
* Value for how many times a request will be made at most in case of retry.
681680
*/
@@ -708,6 +707,15 @@ export interface ClientDefaults extends Partial<__SmithyConfiguration<__HttpHand
708707
*/
709708
defaultsMode?: __DefaultsMode | __Provider<__DefaultsMode>;
710709

710+
/**
711+
* Whether to escape request path when signing the request.
712+
*/
713+
signingEscapePath?: boolean;
714+
715+
/**
716+
* Whether to override the request region with the region inferred from requested resource's ARN. Defaults to false.
717+
*/
718+
useArnRegion?: boolean | Provider<boolean>;
711719
/**
712720
* The internal function that inject utilities to runtime-specific stream to help users consume the data
713721
* @internal
@@ -725,9 +733,9 @@ export type S3ClientConfigType = Partial<__SmithyConfiguration<__HttpHandlerOpti
725733
RegionInputConfig &
726734
HostHeaderInputConfig &
727735
EndpointInputConfig<EndpointParameters> &
728-
AwsAuthInputConfig &
729-
S3InputConfig &
730736
EventStreamSerdeInputConfig &
737+
HttpAuthSchemeInputConfig &
738+
S3InputConfig &
731739
ClientInputEndpointParameters;
732740
/**
733741
* @public
@@ -747,9 +755,9 @@ export type S3ClientResolvedConfigType = __SmithyResolvedConfiguration<__HttpHan
747755
RegionResolvedConfig &
748756
HostHeaderResolvedConfig &
749757
EndpointResolvedConfig<EndpointParameters> &
750-
AwsAuthResolvedConfig &
751-
S3ResolvedConfig &
752758
EventStreamSerdeResolvedConfig &
759+
HttpAuthSchemeResolvedConfig &
760+
S3ResolvedConfig &
753761
ClientResolvedEndpointParameters;
754762
/**
755763
* @public
@@ -781,9 +789,9 @@ export class S3Client extends __Client<
781789
const _config_4 = resolveRegionConfig(_config_3);
782790
const _config_5 = resolveHostHeaderConfig(_config_4);
783791
const _config_6 = resolveEndpointConfig(_config_5);
784-
const _config_7 = resolveAwsAuthConfig(_config_6);
785-
const _config_8 = resolveS3Config(_config_7, { session: [() => this, CreateSessionCommand] });
786-
const _config_9 = resolveEventStreamSerdeConfig(_config_8);
792+
const _config_7 = resolveEventStreamSerdeConfig(_config_6);
793+
const _config_8 = resolveHttpAuthSchemeConfig(_config_7);
794+
const _config_9 = resolveS3Config(_config_8, { session: [() => this, CreateSessionCommand] });
787795
const _config_10 = resolveRuntimeExtensions(_config_9, configuration?.extensions || []);
788796
super(_config_10);
789797
this.config = _config_10;
@@ -793,11 +801,22 @@ export class S3Client extends __Client<
793801
this.middlewareStack.use(getHostHeaderPlugin(this.config));
794802
this.middlewareStack.use(getLoggerPlugin(this.config));
795803
this.middlewareStack.use(getRecursionDetectionPlugin(this.config));
796-
this.middlewareStack.use(getAwsAuthPlugin(this.config));
804+
this.middlewareStack.use(
805+
getHttpAuthSchemeEndpointRuleSetPlugin(this.config, {
806+
httpAuthSchemeParametersProvider: defaultS3HttpAuthSchemeParametersProvider,
807+
identityProviderConfigProvider: async (config: S3ClientResolvedConfig) =>
808+
new DefaultIdentityProviderConfig({
809+
"aws.auth#sigv4": config.credentials,
810+
"aws.auth#sigv4a": config.credentials,
811+
}),
812+
})
813+
);
814+
this.middlewareStack.use(getHttpSigningPlugin(this.config));
797815
this.middlewareStack.use(getValidateBucketNamePlugin(this.config));
798816
this.middlewareStack.use(getAddExpectContinuePlugin(this.config));
799817
this.middlewareStack.use(getRegionRedirectMiddlewarePlugin(this.config));
800818
this.middlewareStack.use(getS3ExpressPlugin(this.config));
819+
this.middlewareStack.use(getS3ExpressHttpSigningPlugin(this.config));
801820
}
802821

803822
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// smithy-typescript generated code
2+
import { AwsCredentialIdentity, AwsCredentialIdentityProvider, HttpAuthScheme } from "@smithy/types";
3+
4+
import { S3HttpAuthSchemeProvider } from "./httpAuthSchemeProvider";
5+
6+
/**
7+
* @internal
8+
*/
9+
export interface HttpAuthExtensionConfiguration {
10+
setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void;
11+
httpAuthSchemes(): HttpAuthScheme[];
12+
setHttpAuthSchemeProvider(httpAuthSchemeProvider: S3HttpAuthSchemeProvider): void;
13+
httpAuthSchemeProvider(): S3HttpAuthSchemeProvider;
14+
setCredentials(credentials: AwsCredentialIdentity | AwsCredentialIdentityProvider): void;
15+
credentials(): AwsCredentialIdentity | AwsCredentialIdentityProvider | undefined;
16+
}
17+
18+
/**
19+
* @internal
20+
*/
21+
export type HttpAuthRuntimeConfig = Partial<{
22+
httpAuthSchemes: HttpAuthScheme[];
23+
httpAuthSchemeProvider: S3HttpAuthSchemeProvider;
24+
credentials: AwsCredentialIdentity | AwsCredentialIdentityProvider;
25+
}>;
26+
27+
/**
28+
* @internal
29+
*/
30+
export const getHttpAuthExtensionConfiguration = (
31+
runtimeConfig: HttpAuthRuntimeConfig
32+
): HttpAuthExtensionConfiguration => {
33+
const _httpAuthSchemes = runtimeConfig.httpAuthSchemes!;
34+
let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider!;
35+
let _credentials = runtimeConfig.credentials;
36+
return {
37+
setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void {
38+
const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId);
39+
if (index === -1) {
40+
_httpAuthSchemes.push(httpAuthScheme);
41+
} else {
42+
_httpAuthSchemes.splice(index, 1, httpAuthScheme);
43+
}
44+
},
45+
httpAuthSchemes(): HttpAuthScheme[] {
46+
return _httpAuthSchemes;
47+
},
48+
setHttpAuthSchemeProvider(httpAuthSchemeProvider: S3HttpAuthSchemeProvider): void {
49+
_httpAuthSchemeProvider = httpAuthSchemeProvider;
50+
},
51+
httpAuthSchemeProvider(): S3HttpAuthSchemeProvider {
52+
return _httpAuthSchemeProvider;
53+
},
54+
setCredentials(credentials: AwsCredentialIdentity | AwsCredentialIdentityProvider): void {
55+
_credentials = credentials;
56+
},
57+
credentials(): AwsCredentialIdentity | AwsCredentialIdentityProvider | undefined {
58+
return _credentials;
59+
},
60+
};
61+
};
62+
63+
/**
64+
* @internal
65+
*/
66+
export const resolveHttpAuthRuntimeConfig = (config: HttpAuthExtensionConfiguration): HttpAuthRuntimeConfig => {
67+
return {
68+
httpAuthSchemes: config.httpAuthSchemes(),
69+
httpAuthSchemeProvider: config.httpAuthSchemeProvider(),
70+
credentials: config.credentials(),
71+
};
72+
};

0 commit comments

Comments
 (0)