Skip to content

Commit 5e6af3f

Browse files
authored
fix(middleware-signing): attempt secondary authscheme selection during request signing (#5895)
* fix(middleware-signing): attempt secondary authscheme selection during request signing * chore: typo Co-authored-by: Steven Yuan * fix(middware-signing): do not set input signing region when incoming authscheme is sigv4a --------- Co-authored-by: Steven Yuan
1 parent d177bd0 commit 5e6af3f

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

packages/middleware-signing/src/awsAuthConfiguration.ts

+15-4
Original file line numberDiff line numberDiff line change
@@ -194,19 +194,30 @@ export const resolveAwsAuthConfig = <T>(
194194
authScheme
195195
);
196196

197+
const isSigv4a = authScheme?.name === "sigv4a";
198+
197199
const signingRegion = authScheme.signingRegion;
198200
const signingService = authScheme.signingName;
199-
// update client's singing region and signing service config if they are resolved.
200-
// signing region resolving order: user supplied signingRegion -> endpoints.json inferred region -> client region
201-
input.signingRegion = input.signingRegion || signingRegion;
201+
202+
let regionForSigner: string | undefined;
203+
204+
if (isSigv4a) {
205+
regionForSigner = input.signingRegion || signingRegion;
206+
} else {
207+
// update client's signing region and signing service config if they are resolved.
208+
// signing region resolving order: user supplied signingRegion -> endpoints.json inferred region -> client region
209+
input.signingRegion = input.signingRegion || signingRegion;
210+
regionForSigner = input.signingRegion;
211+
}
212+
202213
// signing name resolving order:
203214
// user supplied signingName -> endpoints.json inferred (credential scope -> model arnNamespace) -> model service id
204215
input.signingName = input.signingName || signingService || input.serviceId;
205216

206217
const params: SignatureV4Init & SignatureV4CryptoInit = {
207218
...input,
208219
credentials: normalizedCreds,
209-
region: input.signingRegion,
220+
region: regionForSigner,
210221
service: input.signingName,
211222
sha256,
212223
uriEscapePath: signingEscapePath,

packages/middleware-signing/src/awsAuthMiddleware.ts

+31-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
HttpRequest as IHttpRequest,
1111
Pluggable,
1212
RelativeMiddlewareOptions,
13+
RequestSigner,
1314
} from "@smithy/types";
1415

1516
import { AwsAuthResolvedConfig } from "./awsAuthConfiguration";
@@ -25,14 +26,40 @@ export const awsAuthMiddleware =
2526
if (!HttpRequest.isInstance(args.request)) return next(args);
2627

2728
// TODO(identityandauth): call authScheme resolver
28-
const authScheme: AuthScheme | undefined = context.endpointV2?.properties?.authSchemes?.[0];
29+
let authScheme: AuthScheme | undefined;
30+
let signer: RequestSigner | undefined;
31+
32+
const firstAuthScheme = context.endpointV2?.properties?.authSchemes?.[0];
33+
const secondAuthScheme = context.endpointV2?.properties?.authSchemes?.[1];
34+
const firstAuthSchemeIsSigv4a = firstAuthScheme?.name === "sigv4a";
35+
36+
if (firstAuthSchemeIsSigv4a && secondAuthScheme) {
37+
signer = await options.signer((authScheme = firstAuthScheme));
38+
const uncheckedSigner = signer as any;
39+
const sigv4aAvailable = (() => {
40+
if (typeof uncheckedSigner?.getSigv4aSigner === "function") {
41+
if (uncheckedSigner?.signerOptions?.runtime !== "node") {
42+
return false;
43+
}
44+
try {
45+
uncheckedSigner.getSigv4aSigner();
46+
return true;
47+
} catch (e: unknown) {}
48+
}
49+
return false;
50+
})();
51+
if (!sigv4aAvailable) {
52+
signer = await options.signer((authScheme = secondAuthScheme));
53+
}
54+
} else {
55+
signer = await options.signer((authScheme = firstAuthScheme));
56+
}
57+
58+
let signedRequest: IHttpRequest;
2959

3060
const multiRegionOverride: string | undefined =
3161
authScheme?.name === "sigv4a" ? authScheme?.signingRegionSet?.join(",") : undefined;
3262

33-
const signer = await options.signer(authScheme);
34-
35-
let signedRequest: IHttpRequest;
3663
const signingOptions = {
3764
signingDate: getSkewCorrectedDate(options.systemClockOffset),
3865
signingRegion: multiRegionOverride || context["signing_region"],

0 commit comments

Comments
 (0)