opusdev/vector-similarity-api
1
1import { type AuthProvider } from './cmap/auth/auth_provider';2import { GSSAPI } from './cmap/auth/gssapi';3import { type AuthMechanismProperties } from './cmap/auth/mongo_credentials';4import { MongoDBAWS } from './cmap/auth/mongodb_aws';5import { MongoDBOIDC, OIDC_WORKFLOWS, type Workflow } from './cmap/auth/mongodb_oidc';6import { AutomatedCallbackWorkflow } from './cmap/auth/mongodb_oidc/automated_callback_workflow';7import { HumanCallbackWorkflow } from './cmap/auth/mongodb_oidc/human_callback_workflow';8import { TokenCache } from './cmap/auth/mongodb_oidc/token_cache';9import { Plain } from './cmap/auth/plain';10import { AuthMechanism } from './cmap/auth/providers';11import { ScramSHA1, ScramSHA256 } from './cmap/auth/scram';12import { X509 } from './cmap/auth/x509';13import { MongoInvalidArgumentError } from './error';14 15/** @internal */16const AUTH_PROVIDERS = new Map<17 AuthMechanism | string,18 (authMechanismProperties: AuthMechanismProperties) => AuthProvider19>([20 [21 AuthMechanism.MONGODB_AWS,22 ({ AWS_CREDENTIAL_PROVIDER }) => new MongoDBAWS(AWS_CREDENTIAL_PROVIDER)23 ],24 [25 AuthMechanism.MONGODB_CR,26 () => {27 throw new MongoInvalidArgumentError(28 'MONGODB-CR is no longer a supported auth mechanism in MongoDB 4.0+'29 );30 }31 ],32 [AuthMechanism.MONGODB_GSSAPI, () => new GSSAPI()],33 [AuthMechanism.MONGODB_OIDC, properties => new MongoDBOIDC(getWorkflow(properties))],34 [AuthMechanism.MONGODB_PLAIN, () => new Plain()],35 [AuthMechanism.MONGODB_SCRAM_SHA1, () => new ScramSHA1()],36 [AuthMechanism.MONGODB_SCRAM_SHA256, () => new ScramSHA256()],37 [AuthMechanism.MONGODB_X509, () => new X509()]38]);39 40/**41 * Create a set of providers per client42 * to avoid sharing the provider's cache between different clients.43 * @internal44 */45export class MongoClientAuthProviders {46 private existingProviders: Map<AuthMechanism | string, AuthProvider> = new Map();47 48 /**49 * Get or create an authentication provider based on the provided mechanism.50 * We don't want to create all providers at once, as some providers may not be used.51 * @param name - The name of the provider to get or create.52 * @param credentials - The credentials.53 * @returns The provider.54 * @throws MongoInvalidArgumentError if the mechanism is not supported.55 * @internal56 */57 getOrCreateProvider(58 name: AuthMechanism | string,59 authMechanismProperties: AuthMechanismProperties60 ): AuthProvider {61 const authProvider = this.existingProviders.get(name);62 if (authProvider) {63 return authProvider;64 }65 66 const providerFunction = AUTH_PROVIDERS.get(name);67 if (!providerFunction) {68 throw new MongoInvalidArgumentError(`authMechanism ${name} not supported`);69 }70 71 const provider = providerFunction(authMechanismProperties);72 this.existingProviders.set(name, provider);73 return provider;74 }75}76 77/**78 * Gets either a device workflow or callback workflow.79 */80function getWorkflow(authMechanismProperties: AuthMechanismProperties): Workflow {81 if (authMechanismProperties.OIDC_HUMAN_CALLBACK) {82 return new HumanCallbackWorkflow(new TokenCache(), authMechanismProperties.OIDC_HUMAN_CALLBACK);83 } else if (authMechanismProperties.OIDC_CALLBACK) {84 return new AutomatedCallbackWorkflow(new TokenCache(), authMechanismProperties.OIDC_CALLBACK);85 } else {86 const environment = authMechanismProperties.ENVIRONMENT;87 const workflow = OIDC_WORKFLOWS.get(environment)?.();88 if (!workflow) {89 throw new MongoInvalidArgumentError(90 `Could not load workflow for environment ${authMechanismProperties.ENVIRONMENT}`91 );92 }93 return workflow;94 }95}96 