Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 412x 412x 412x 412x 412x 412x 412x 8x 4x | import { MongoGCPError } from '../../../error'; import { get } from '../../../utils'; import { type MongoCredentials } from '../mongo_credentials'; import { type AccessToken, MachineWorkflow } from './machine_workflow'; import { type TokenCache } from './token_cache'; /** GCP base URL. */ const GCP_BASE_URL = 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity'; /** GCP request headers. */ const GCP_HEADERS = Object.freeze({ 'Metadata-Flavor': 'Google' }); /** Error for when the token audience is missing in the environment. */ const TOKEN_RESOURCE_MISSING_ERROR = 'TOKEN_RESOURCE must be set in the auth mechanism properties when ENVIRONMENT is gcp.'; export class GCPMachineWorkflow extends MachineWorkflow { /** * Instantiate the machine workflow. */ constructor(cache: TokenCache) { super(cache); } /** * Get the token from the environment. */ async getToken(credentials?: MongoCredentials): Promise<AccessToken> { const tokenAudience = credentials?.mechanismProperties.TOKEN_RESOURCE; if (!tokenAudience) { throw new MongoGCPError(TOKEN_RESOURCE_MISSING_ERROR); } return await getGcpTokenData(tokenAudience); } } /** * Hit the GCP endpoint to get the token data. */ async function getGcpTokenData(tokenAudience: string): Promise<AccessToken> { const url = new URL(GCP_BASE_URL); url.searchParams.append('audience', tokenAudience); const response = await get(url, { headers: GCP_HEADERS }); if (response.status !== 200) { throw new MongoGCPError( `Status code ${response.status} returned from the GCP endpoint. Response body: ${response.body}` ); } return { access_token: response.body }; } |