Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 1 addition & 0 deletions packages/core/src/submodules/httpAuthSchemes/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from "./aws_sdk";
export * from "./utils/getBearerTokenEnvKey";
1 change: 1 addition & 0 deletions packages/token-providers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
},
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/core": "*",
"@aws-sdk/nested-clients": "*",
"@aws-sdk/types": "*",
"@smithy/property-provider": "^4.0.2",
Expand Down
46 changes: 46 additions & 0 deletions packages/token-providers/src/fromEnvBearerToken.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { getBearerTokenEnvKey } from "@aws-sdk/core";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";

import { fromEnvBearerToken } from "./fromEnvBearerToken";

vi.mock("@aws-sdk/core");

describe("fromEnvBearerToken", () => {
const originalEnv = process.env;
const mockInit = { signingName: "signing name" };
const mockBearerTokenEnvKey = "AWS_BEARER_TOKEN_SIGNING_NAME";

beforeEach(() => {
process.env = { ...originalEnv };
vi.mocked(getBearerTokenEnvKey).mockReturnValue(mockBearerTokenEnvKey);
});

afterEach(() => {
process.env = originalEnv;
vi.clearAllMocks();
});

describe("throws error", () => {
it("when signingName is not passed", async () => {
await expect(fromEnvBearerToken()()).rejects.toThrow(
"Please pass 'signingName' to compute environment variable key"
);
expect(getBearerTokenEnvKey).not.toHaveBeenCalled();
});

it("when token is not present in environment variable", async () => {
await expect(fromEnvBearerToken(mockInit)()).rejects.toThrow(
`Token not present in '${mockBearerTokenEnvKey}' environment variable`
);
expect(getBearerTokenEnvKey).toHaveBeenCalledWith(mockInit.signingName);
});
});

it("returns token from environment variable", async () => {
const mockBearerToken = "mock-bearer-token";
process.env[mockBearerTokenEnvKey] = mockBearerToken;
const token = await fromEnvBearerToken(mockInit)();
expect(token).toEqual({ token: mockBearerToken });
expect(getBearerTokenEnvKey).toHaveBeenCalledWith(mockInit.signingName);
});
});
34 changes: 34 additions & 0 deletions packages/token-providers/src/fromEnvBearerToken.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { getBearerTokenEnvKey } from "@aws-sdk/core";
import type { CredentialProviderOptions, TokenIdentityProvider } from "@aws-sdk/types";
import { TokenProviderError } from "@smithy/property-provider";

export interface FromEnvBearerTokenInit extends CredentialProviderOptions {
signingName?: string;
}

/**
* Creates a TokenIdentityProvider that retrieves bearer token from environment variable
*
* @param options - Configuration options for the token provider
* @param options.logger - Optional logger for debug messages
* @param options.signingName - Service signing name used to determine environment variable key
* @returns TokenIdentityProvider that provides bearer token from environment variable
*
* @public
*/
export const fromEnvBearerToken =
({ logger, signingName }: FromEnvBearerTokenInit = {}): TokenIdentityProvider =>
async () => {
logger?.debug("@aws-sdk/token-providers - fromEnvBearerToken");

if (!signingName) {
throw new TokenProviderError("Please pass 'signingName' to compute environment variable key", { logger });
}

const bearerTokenKey = getBearerTokenEnvKey(signingName);
if (!(bearerTokenKey in process.env)) {
throw new TokenProviderError(`Token not present in '${bearerTokenKey}' environment variable`, { logger });
}

return { token: process.env[bearerTokenKey]! };
};
1 change: 1 addition & 0 deletions packages/token-providers/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from "./fromEnvBearerToken";
export * from "./fromSso";
export * from "./fromStatic";
export * from "./nodeProvider";
1 change: 1 addition & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -23675,6 +23675,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@aws-sdk/token-providers@workspace:packages/token-providers"
dependencies:
"@aws-sdk/core": "npm:*"
"@aws-sdk/nested-clients": "npm:*"
"@aws-sdk/types": "npm:*"
"@smithy/property-provider": "npm:^4.0.2"
Expand Down
Loading