Skip to content

Commit

Permalink
feat(experimentalIdentityAndAuth): release phase for `@smithy.api#htt…
Browse files Browse the repository at this point in the history
…pBearerAuth` (#5271)

Services:

- CodeCatalyst
  • Loading branch information
syall committed Nov 14, 2023
1 parent 6bd28f1 commit 2e1ac5b
Show file tree
Hide file tree
Showing 10 changed files with 290 additions and 8 deletions.
4 changes: 3 additions & 1 deletion clients/client-codecatalyst/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,15 @@
"@aws-sdk/middleware-host-header": "*",
"@aws-sdk/middleware-logger": "*",
"@aws-sdk/middleware-recursion-detection": "*",
"@aws-sdk/middleware-token": "*",
"@aws-sdk/middleware-user-agent": "*",
"@aws-sdk/region-config-resolver": "*",
"@aws-sdk/token-providers": "*",
"@aws-sdk/types": "*",
"@aws-sdk/util-endpoints": "*",
"@aws-sdk/util-user-agent-browser": "*",
"@aws-sdk/util-user-agent-node": "*",
"@smithy/config-resolver": "^2.0.18",
"@smithy/core": "^1.0.1",
"@smithy/fetch-http-handler": "^2.2.6",
"@smithy/hash-node": "^2.0.15",
"@smithy/invalid-dependency": "^2.0.13",
Expand All @@ -53,6 +54,7 @@
"@smithy/util-defaults-mode-browser": "^2.0.19",
"@smithy/util-defaults-mode-node": "^2.0.25",
"@smithy/util-endpoints": "^1.0.4",
"@smithy/util-middleware": "^2.0.6",
"@smithy/util-retry": "^2.0.6",
"@smithy/util-utf8": "^2.0.2",
"tslib": "^2.5.0"
Expand Down
39 changes: 33 additions & 6 deletions clients/client-codecatalyst/src/CodeCatalystClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,18 @@ import {
} from "@aws-sdk/middleware-host-header";
import { getLoggerPlugin } from "@aws-sdk/middleware-logger";
import { getRecursionDetectionPlugin } from "@aws-sdk/middleware-recursion-detection";
import { getTokenPlugin, resolveTokenConfig, TokenInputConfig, TokenResolvedConfig } from "@aws-sdk/middleware-token";
import {
getUserAgentPlugin,
resolveUserAgentConfig,
UserAgentInputConfig,
UserAgentResolvedConfig,
} from "@aws-sdk/middleware-user-agent";
import { RegionInputConfig, RegionResolvedConfig, resolveRegionConfig } from "@smithy/config-resolver";
import {
DefaultIdentityProviderConfig,
getHttpAuthSchemeEndpointRuleSetPlugin,
getHttpSigningPlugin,
} from "@smithy/core";
import { getContentLengthPlugin } from "@smithy/middleware-content-length";
import { EndpointInputConfig, EndpointResolvedConfig, resolveEndpointConfig } from "@smithy/middleware-endpoint";
import { getRetryPlugin, resolveRetryConfig, RetryInputConfig, RetryResolvedConfig } from "@smithy/middleware-retry";
Expand Down Expand Up @@ -44,6 +48,12 @@ import {
UserAgent as __UserAgent,
} from "@smithy/types";

import {
defaultCodeCatalystHttpAuthSchemeParametersProvider,
HttpAuthSchemeInputConfig,
HttpAuthSchemeResolvedConfig,
resolveHttpAuthSchemeConfig,
} from "./auth/httpAuthSchemeProvider";
import { CreateAccessTokenCommandInput, CreateAccessTokenCommandOutput } from "./commands/CreateAccessTokenCommand";
import {
CreateDevEnvironmentCommandInput,
Expand Down Expand Up @@ -338,8 +348,8 @@ export type CodeCatalystClientConfigType = Partial<__SmithyConfiguration<__HttpH
EndpointInputConfig<EndpointParameters> &
RetryInputConfig &
HostHeaderInputConfig &
TokenInputConfig &
UserAgentInputConfig &
HttpAuthSchemeInputConfig &
ClientInputEndpointParameters;
/**
* @public
Expand All @@ -358,8 +368,8 @@ export type CodeCatalystClientResolvedConfigType = __SmithyResolvedConfiguration
EndpointResolvedConfig<EndpointParameters> &
RetryResolvedConfig &
HostHeaderResolvedConfig &
TokenResolvedConfig &
UserAgentResolvedConfig &
HttpAuthSchemeResolvedConfig &
ClientResolvedEndpointParameters;
/**
* @public
Expand Down Expand Up @@ -534,15 +544,26 @@ export class CodeCatalystClient extends __Client<
*/
readonly config: CodeCatalystClientResolvedConfig;

private getDefaultHttpAuthSchemeParametersProvider() {
return defaultCodeCatalystHttpAuthSchemeParametersProvider;
}

private getIdentityProviderConfigProvider() {
return async (config: CodeCatalystClientResolvedConfig) =>
new DefaultIdentityProviderConfig({
"smithy.api#httpBearerAuth": config.token,
});
}

constructor(...[configuration]: __CheckOptionalClientConfig<CodeCatalystClientConfig>) {
const _config_0 = __getRuntimeConfig(configuration || {});
const _config_1 = resolveClientEndpointParameters(_config_0);
const _config_2 = resolveRegionConfig(_config_1);
const _config_3 = resolveEndpointConfig(_config_2);
const _config_4 = resolveRetryConfig(_config_3);
const _config_5 = resolveHostHeaderConfig(_config_4);
const _config_6 = resolveTokenConfig(_config_5);
const _config_7 = resolveUserAgentConfig(_config_6);
const _config_6 = resolveUserAgentConfig(_config_5);
const _config_7 = resolveHttpAuthSchemeConfig(_config_6);
const _config_8 = resolveRuntimeExtensions(_config_7, configuration?.extensions || []);
super(_config_8);
this.config = _config_8;
Expand All @@ -551,8 +572,14 @@ export class CodeCatalystClient extends __Client<
this.middlewareStack.use(getHostHeaderPlugin(this.config));
this.middlewareStack.use(getLoggerPlugin(this.config));
this.middlewareStack.use(getRecursionDetectionPlugin(this.config));
this.middlewareStack.use(getTokenPlugin(this.config));
this.middlewareStack.use(getUserAgentPlugin(this.config));
this.middlewareStack.use(
getHttpAuthSchemeEndpointRuleSetPlugin(this.config, {
identityProviderConfigProvider: this.getIdentityProviderConfigProvider(),
httpAuthSchemeParametersProvider: this.getDefaultHttpAuthSchemeParametersProvider(),
})
);
this.middlewareStack.use(getHttpSigningPlugin(this.config));
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// smithy-typescript generated code
import { HttpAuthScheme, TokenIdentity, TokenIdentityProvider } from "@smithy/types";

import { CodeCatalystHttpAuthSchemeProvider } from "./httpAuthSchemeProvider";

/**
* @internal
*/
export interface HttpAuthExtensionConfiguration {
setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void;
httpAuthSchemes(): HttpAuthScheme[];
setHttpAuthSchemeProvider(httpAuthSchemeProvider: CodeCatalystHttpAuthSchemeProvider): void;
httpAuthSchemeProvider(): CodeCatalystHttpAuthSchemeProvider;
setToken(token: TokenIdentity | TokenIdentityProvider): void;
token(): TokenIdentity | TokenIdentityProvider | undefined;
}

/**
* @internal
*/
export type HttpAuthRuntimeConfig = Partial<{
httpAuthSchemes: HttpAuthScheme[];
httpAuthSchemeProvider: CodeCatalystHttpAuthSchemeProvider;
token: TokenIdentity | TokenIdentityProvider;
}>;

/**
* @internal
*/
export const getHttpAuthExtensionConfiguration = (
runtimeConfig: HttpAuthRuntimeConfig
): HttpAuthExtensionConfiguration => {
const _httpAuthSchemes = runtimeConfig.httpAuthSchemes!;
let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider!;
let _token = runtimeConfig.token;
return {
setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void {
const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId);
if (index === -1) {
_httpAuthSchemes.push(httpAuthScheme);
} else {
_httpAuthSchemes.splice(index, 1, httpAuthScheme);
}
},
httpAuthSchemes(): HttpAuthScheme[] {
return _httpAuthSchemes;
},
setHttpAuthSchemeProvider(httpAuthSchemeProvider: CodeCatalystHttpAuthSchemeProvider): void {
_httpAuthSchemeProvider = httpAuthSchemeProvider;
},
httpAuthSchemeProvider(): CodeCatalystHttpAuthSchemeProvider {
return _httpAuthSchemeProvider;
},
setToken(token: TokenIdentity | TokenIdentityProvider): void {
_token = token;
},
token(): TokenIdentity | TokenIdentityProvider | undefined {
return _token;
},
};
};

/**
* @internal
*/
export const resolveHttpAuthRuntimeConfig = (config: HttpAuthExtensionConfiguration): HttpAuthRuntimeConfig => {
return {
httpAuthSchemes: config.httpAuthSchemes(),
httpAuthSchemeProvider: config.httpAuthSchemeProvider(),
token: config.token(),
};
};
134 changes: 134 additions & 0 deletions clients/client-codecatalyst/src/auth/httpAuthSchemeProvider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
// smithy-typescript generated code
import { doesIdentityRequireRefresh, isIdentityExpired, memoizeIdentityProvider } from "@smithy/core";
import {
HandlerExecutionContext,
HttpAuthOption,
HttpAuthScheme,
HttpAuthSchemeParameters,
HttpAuthSchemeParametersProvider,
HttpAuthSchemeProvider,
TokenIdentity,
TokenIdentityProvider,
} from "@smithy/types";
import { getSmithyContext } from "@smithy/util-middleware";

import { CodeCatalystClientResolvedConfig } from "../CodeCatalystClient";

/**
* @internal
*/
export interface CodeCatalystHttpAuthSchemeParameters extends HttpAuthSchemeParameters {}

/**
* @internal
*/
export interface CodeCatalystHttpAuthSchemeParametersProvider
extends HttpAuthSchemeParametersProvider<
CodeCatalystClientResolvedConfig,
HandlerExecutionContext,
CodeCatalystHttpAuthSchemeParameters,
object
> {}

/**
* @internal
*/
export const defaultCodeCatalystHttpAuthSchemeParametersProvider = async (
config: CodeCatalystClientResolvedConfig,
context: HandlerExecutionContext,
input: object
): Promise<CodeCatalystHttpAuthSchemeParameters> => {
return {
operation: getSmithyContext(context).operation as string,
};
};

function createSmithyApiHttpBearerAuthHttpAuthOption(
authParameters: CodeCatalystHttpAuthSchemeParameters
): HttpAuthOption {
return {
schemeId: "smithy.api#httpBearerAuth",
propertiesExtractor: (__config, context) => ({
/**
* @internal
*/
identityProperties: {
__config,
},
}),
};
}

/**
* @internal
*/
export interface CodeCatalystHttpAuthSchemeProvider
extends HttpAuthSchemeProvider<CodeCatalystHttpAuthSchemeParameters> {}

/**
* @internal
*/
export const defaultCodeCatalystHttpAuthSchemeProvider: CodeCatalystHttpAuthSchemeProvider = (authParameters) => {
const options: HttpAuthOption[] = [];
switch (authParameters.operation) {
default: {
options.push(createSmithyApiHttpBearerAuthHttpAuthOption(authParameters));
}
}
return options;
};

/**
* @internal
*/
export interface HttpAuthSchemeInputConfig {
/**
* experimentalIdentityAndAuth: Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme.
* @internal
*/
httpAuthSchemes?: HttpAuthScheme[];

/**
* experimentalIdentityAndAuth: Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use.
* @internal
*/
httpAuthSchemeProvider?: CodeCatalystHttpAuthSchemeProvider;

/**
* The token used to authenticate requests.
*/
token?: TokenIdentity | TokenIdentityProvider;
}

/**
* @internal
*/
export interface HttpAuthSchemeResolvedConfig {
/**
* experimentalIdentityAndAuth: Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme.
* @internal
*/
readonly httpAuthSchemes: HttpAuthScheme[];

/**
* experimentalIdentityAndAuth: Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use.
* @internal
*/
readonly httpAuthSchemeProvider: CodeCatalystHttpAuthSchemeProvider;

/**
* The token used to authenticate requests.
*/
readonly token?: TokenIdentityProvider;
}

/**
* @internal
*/
export const resolveHttpAuthSchemeConfig = (config: HttpAuthSchemeInputConfig): HttpAuthSchemeResolvedConfig => {
const token = memoizeIdentityProvider(config.token, isIdentityExpired, doesIdentityRequireRefresh);
return {
...config,
token,
} as HttpAuthSchemeResolvedConfig;
};
5 changes: 4 additions & 1 deletion clients/client-codecatalyst/src/extensionConfiguration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@ import { AwsRegionExtensionConfiguration } from "@aws-sdk/types";
import { HttpHandlerExtensionConfiguration } from "@smithy/protocol-http";
import { DefaultExtensionConfiguration } from "@smithy/types";

import { HttpAuthExtensionConfiguration } from "./auth/httpAuthExtensionConfiguration";

/**
* @internal
*/
export interface CodeCatalystExtensionConfiguration
extends HttpHandlerExtensionConfiguration,
DefaultExtensionConfiguration,
AwsRegionExtensionConfiguration {}
AwsRegionExtensionConfiguration,
HttpAuthExtensionConfiguration {}
13 changes: 13 additions & 0 deletions clients/client-codecatalyst/src/runtimeConfig.browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import packageInfo from "../package.json"; // eslint-disable-line
import { Sha256 } from "@aws-crypto/sha256-browser";
import { defaultUserAgent } from "@aws-sdk/util-user-agent-browser";
import { DEFAULT_USE_DUALSTACK_ENDPOINT, DEFAULT_USE_FIPS_ENDPOINT } from "@smithy/config-resolver";
import { HttpBearerAuthSigner } from "@smithy/core";
import { FetchHttpHandler as RequestHandler, streamCollector } from "@smithy/fetch-http-handler";
import { IdentityProviderConfig } from "@smithy/types";
import { calculateBodyLength } from "@smithy/util-body-length-browser";
import { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE } from "@smithy/util-retry";
import { CodeCatalystClientConfig } from "./CodeCatalystClient";
Expand All @@ -29,6 +31,17 @@ export const getRuntimeConfig = (config: CodeCatalystClientConfig) => {
defaultUserAgentProvider:
config?.defaultUserAgentProvider ??
defaultUserAgent({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }),
httpAuthSchemes: config?.httpAuthSchemes ?? [
{
schemeId: "smithy.api#httpBearerAuth",
identityProvider: (ipc: IdentityProviderConfig) =>
ipc.getIdentityProvider("smithy.api#httpBearerAuth") ||
(async () => {
throw new Error("`token` is missing");
}),
signer: new HttpBearerAuthSigner(),
},
],
maxAttempts: config?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,
requestHandler: config?.requestHandler ?? new RequestHandler(defaultConfigProvider),
retryMode: config?.retryMode ?? (async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE),
Expand Down
Loading

0 comments on commit 2e1ac5b

Please sign in to comment.