-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
auth.ts
83 lines (65 loc) · 2.28 KB
/
auth.ts
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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() };
// Register default provider if not disabled
if (!env.AUTH_DISABLE_DEFAULT) {
const defaultProvider = getProviderInstance('local', options)!;
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);
}
}