Skip to content

feat(experimentalIdentityAndAuth): release phase for @smithy.api#httpBearerAuth #5271

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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