Files
directus/api/src/auth.ts
Aiden Foxx b7ee318e43 LDAP auth provider (#9074)
* Added LDAP implementation

* Cleanup and added refresh checking

* Added provider check to ldap

* Added LDAP docs

* Always update LDAP user role on authentication

* Fetched package-json from github

* Fixed lint error

* Update api/src/auth/drivers/ldap.ts

* Update api/src/auth/drivers/ldap.ts

* Added missing locale key

* Update docs/guides/api-config.md

* Update docs/configuration/config-options.md

* Update api/src/auth/drivers/ldap.ts

* Added back LDAP example

* Update config-options.md

* getUserID function sjhouldn't care about password

* Added LOCKOUT to INVALID_ACCOUNT_FLAGS

* Update styling approach for v-select

Co-authored-by: rijkvanzanten <rijkvanzanten@me.com>
2021-10-29 11:58:10 -04:00

82 lines
2.2 KiB
TypeScript

import getDatabase from './database';
import env from './env';
import logger from './logger';
import { AuthDriver } from './auth/auth';
import { LocalAuthDriver, OAuth2AuthDriver, OpenIDAuthDriver, LDAPAuthDriver } from './auth/drivers';
import { DEFAULT_AUTH_PROVIDER } from './constants';
import { InvalidConfigException } from './exceptions';
import { AuthDriverOptions } from './types';
import { getConfigFromEnv } from './utils/get-config-from-env';
import { getSchema } from './utils/get-schema';
import { toArray } from '@directus/shared/utils';
const providerNames = toArray(env.AUTH_PROVIDERS);
const providers: Map<string, AuthDriver> = new Map();
export function getAuthProvider(provider: string): AuthDriver {
if (!providers.has(provider)) {
throw new InvalidConfigException('Auth provider not configured', { provider });
}
return providers.get(provider)!;
}
export async function registerAuthProviders(): Promise<void> {
const options = { knex: getDatabase(), schema: await getSchema() };
const defaultProvider = getProviderInstance('local', options)!;
// Register default provider
providers.set(DEFAULT_AUTH_PROVIDER, defaultProvider);
if (!env.AUTH_PROVIDERS) {
return;
}
// Register configured providers
providerNames.forEach((name: string) => {
name = name.trim();
if (name === DEFAULT_AUTH_PROVIDER) {
logger.error(`Cannot override "${DEFAULT_AUTH_PROVIDER}" auth provider.`);
process.exit(1);
}
const { driver, ...config } = getConfigFromEnv(`AUTH_${name.toUpperCase()}_`);
if (!driver) {
logger.warn(`Missing driver definition for "${name}" auth provider.`);
return;
}
const provider = getProviderInstance(driver, options, { provider: name, ...config });
if (!provider) {
logger.warn(`Invalid "${driver}" auth driver.`);
return;
}
providers.set(name, provider);
});
}
function getProviderInstance(
driver: string,
options: AuthDriverOptions,
config: Record<string, any> = {}
): AuthDriver | undefined {
switch (driver) {
case 'local':
return new LocalAuthDriver(options, config);
case 'oauth2':
return new OAuth2AuthDriver(options, config);
case 'openid':
return new OpenIDAuthDriver(options, config);
case 'ldap':
return new LDAPAuthDriver(options, config);
}
}