Skip to content

Commit 6c961b6

Browse files
trivikrkuhe
andauthored
chore(token-providers): add provider to retrieve token from env var (#7097)
Co-authored-by: George Fu <[email protected]>
1 parent 3bdc582 commit 6c961b6

File tree

7 files changed

+96
-0
lines changed

7 files changed

+96
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from "./aws_sdk";
2+
export * from "./utils/getBearerTokenEnvKey";

packages/token-providers/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ import { fromSso } from "@aws-sdk/token-providers";
2727
const ssoToken = await fromSso();
2828
```
2929

30+
## Env Token Provider with Signing Name
31+
32+
```ts
33+
import { fromEnvSigningName } from "@aws-sdk/token-providers";
34+
35+
// returns token from environment, where token's key is based on signing name.
36+
const envSigningNameToken = await fromEnvSigningName({ signingName: "signing name" });
37+
```
38+
3039
## Token Provider Chain
3140

3241
```ts

packages/token-providers/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
},
2828
"license": "Apache-2.0",
2929
"dependencies": {
30+
"@aws-sdk/core": "*",
3031
"@aws-sdk/nested-clients": "*",
3132
"@aws-sdk/types": "*",
3233
"@smithy/property-provider": "^4.0.2",
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { getBearerTokenEnvKey } from "@aws-sdk/core";
2+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3+
4+
import { fromEnvSigningName } from "./fromEnvSigningName";
5+
6+
vi.mock("@aws-sdk/core");
7+
8+
describe(fromEnvSigningName.name, () => {
9+
const originalEnv = process.env;
10+
const mockInit = { signingName: "signing name" };
11+
const mockBearerTokenEnvKey = "AWS_BEARER_TOKEN_SIGNING_NAME";
12+
13+
beforeEach(() => {
14+
process.env = { ...originalEnv };
15+
vi.mocked(getBearerTokenEnvKey).mockReturnValue(mockBearerTokenEnvKey);
16+
});
17+
18+
afterEach(() => {
19+
process.env = originalEnv;
20+
vi.clearAllMocks();
21+
});
22+
23+
describe("throws error", () => {
24+
it("when signingName is not passed", async () => {
25+
await expect(fromEnvSigningName()()).rejects.toThrow(
26+
"Please pass 'signingName' to compute environment variable key"
27+
);
28+
expect(getBearerTokenEnvKey).not.toHaveBeenCalled();
29+
});
30+
31+
it("when token is not present in environment variable", async () => {
32+
await expect(fromEnvSigningName(mockInit)()).rejects.toThrow(
33+
`Token not present in '${mockBearerTokenEnvKey}' environment variable`
34+
);
35+
expect(getBearerTokenEnvKey).toHaveBeenCalledWith(mockInit.signingName);
36+
});
37+
});
38+
39+
it("returns token from environment variable", async () => {
40+
const mockBearerToken = "mock-bearer-token";
41+
process.env[mockBearerTokenEnvKey] = mockBearerToken;
42+
const token = await fromEnvSigningName(mockInit)();
43+
expect(token).toEqual({ token: mockBearerToken });
44+
expect(getBearerTokenEnvKey).toHaveBeenCalledWith(mockInit.signingName);
45+
});
46+
});
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { getBearerTokenEnvKey } from "@aws-sdk/core";
2+
import type { CredentialProviderOptions, TokenIdentityProvider } from "@aws-sdk/types";
3+
import { TokenProviderError } from "@smithy/property-provider";
4+
5+
/**
6+
* @public
7+
*/
8+
export interface FromEnvSigningNameInit extends CredentialProviderOptions {
9+
signingName?: string;
10+
}
11+
12+
/**
13+
* Creates a TokenIdentityProvider that retrieves bearer token from environment variable
14+
*
15+
* @param options - Configuration options for the token provider
16+
* @param options.logger - Optional logger for debug messages
17+
* @param options.signingName - Service signing name used to determine environment variable key
18+
* @returns TokenIdentityProvider that provides bearer token from environment variable
19+
*
20+
* @public
21+
*/
22+
export const fromEnvSigningName =
23+
({ logger, signingName }: FromEnvSigningNameInit = {}): TokenIdentityProvider =>
24+
async () => {
25+
logger?.debug?.("@aws-sdk/token-providers - fromEnvSigningName");
26+
27+
if (!signingName) {
28+
throw new TokenProviderError("Please pass 'signingName' to compute environment variable key", { logger });
29+
}
30+
31+
const bearerTokenKey = getBearerTokenEnvKey(signingName);
32+
if (!(bearerTokenKey in process.env)) {
33+
throw new TokenProviderError(`Token not present in '${bearerTokenKey}' environment variable`, { logger });
34+
}
35+
36+
return { token: process.env[bearerTokenKey]! };
37+
};

packages/token-providers/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
export * from "./fromEnvSigningName";
12
export * from "./fromSso";
23
export * from "./fromStatic";
34
export * from "./nodeProvider";

yarn.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23621,6 +23621,7 @@ __metadata:
2362123621
version: 0.0.0-use.local
2362223622
resolution: "@aws-sdk/token-providers@workspace:packages/token-providers"
2362323623
dependencies:
23624+
"@aws-sdk/core": "npm:*"
2362423625
"@aws-sdk/nested-clients": "npm:*"
2362523626
"@aws-sdk/types": "npm:*"
2362623627
"@smithy/property-provider": "npm:^4.0.2"

0 commit comments

Comments
 (0)