@memberjunction/auth-providers 6.1.0-edge.2 → 6.1.0-edge.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +61 -0
- package/LICENSE +180 -4
- package/README.md +71 -2
- package/dist/AuthProviderFactory.d.ts +17 -7
- package/dist/AuthProviderFactory.d.ts.map +1 -1
- package/dist/AuthProviderFactory.js +54 -8
- package/dist/AuthProviderFactory.js.map +1 -1
- package/dist/IEnvironmentConfigurableProvider.d.ts +51 -0
- package/dist/IEnvironmentConfigurableProvider.d.ts.map +1 -0
- package/dist/IEnvironmentConfigurableProvider.js +7 -0
- package/dist/IEnvironmentConfigurableProvider.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/Auth0Provider.d.ts +7 -0
- package/dist/providers/Auth0Provider.d.ts.map +1 -1
- package/dist/providers/Auth0Provider.js +21 -0
- package/dist/providers/Auth0Provider.js.map +1 -1
- package/dist/providers/CognitoProvider.d.ts +6 -0
- package/dist/providers/CognitoProvider.d.ts.map +1 -1
- package/dist/providers/CognitoProvider.js +20 -0
- package/dist/providers/CognitoProvider.js.map +1 -1
- package/dist/providers/MSALProvider.d.ts +8 -0
- package/dist/providers/MSALProvider.d.ts.map +1 -1
- package/dist/providers/MSALProvider.js +21 -0
- package/dist/providers/MSALProvider.js.map +1 -1
- package/dist/providers/OktaProvider.d.ts +8 -0
- package/dist/providers/OktaProvider.d.ts.map +1 -1
- package/dist/providers/OktaProvider.js +22 -0
- package/dist/providers/OktaProvider.js.map +1 -1
- package/dist/providers/WorkOSProvider.d.ts +14 -0
- package/dist/providers/WorkOSProvider.d.ts.map +1 -1
- package/dist/providers/WorkOSProvider.js +26 -0
- package/dist/providers/WorkOSProvider.js.map +1 -1
- package/package.json +4 -3
- package/src/AuthProviderFactory.ts +56 -8
- package/src/IEnvironmentConfigurableProvider.ts +54 -0
- package/src/__tests__/BuiltInProviderRegistration.test.ts +37 -0
- package/src/__tests__/EnvironmentDiscovery.test.ts +146 -0
- package/src/index.ts +1 -0
- package/src/providers/Auth0Provider.ts +22 -0
- package/src/providers/CognitoProvider.ts +21 -0
- package/src/providers/MSALProvider.ts +22 -0
- package/src/providers/OktaProvider.ts +23 -0
- package/src/providers/WorkOSProvider.ts +27 -0
|
@@ -16,6 +16,27 @@ let Auth0Provider = class Auth0Provider extends BaseAuthProvider {
|
|
|
16
16
|
constructor(config) {
|
|
17
17
|
super(config);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Configures Auth0 from AUTH0_DOMAIN + AUTH0_CLIENT_ID (AUTH0_CLIENT_SECRET optional).
|
|
21
|
+
*
|
|
22
|
+
* Mapping preserved byte-for-byte from the env block that previously lived in MJServer's
|
|
23
|
+
* config, so a deployment upgrading to the hook-based discovery sees no change.
|
|
24
|
+
*/
|
|
25
|
+
static ConfigFromEnvironment(env) {
|
|
26
|
+
if (!env.AUTH0_DOMAIN || !env.AUTH0_CLIENT_ID) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
name: 'auth0',
|
|
31
|
+
type: 'auth0',
|
|
32
|
+
issuer: `https://${env.AUTH0_DOMAIN}/`,
|
|
33
|
+
audience: env.AUTH0_CLIENT_ID,
|
|
34
|
+
jwksUri: `https://${env.AUTH0_DOMAIN}/.well-known/jwks.json`,
|
|
35
|
+
clientId: env.AUTH0_CLIENT_ID,
|
|
36
|
+
clientSecret: env.AUTH0_CLIENT_SECRET,
|
|
37
|
+
domain: env.AUTH0_DOMAIN
|
|
38
|
+
};
|
|
39
|
+
}
|
|
19
40
|
/**
|
|
20
41
|
* Extracts user information from Auth0 JWT payload
|
|
21
42
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Auth0Provider.js","sourceRoot":"","sources":["../../src/providers/Auth0Provider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,gBAAgB;IACjD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAmB;QACjC,kCAAkC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAwC,IAAI,KAAK,CAAC;QAEpF,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAEvC,OAAO,SAAS,IAAI,WAAW,IAAI,SAAS,CAAC;IAC/C,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"Auth0Provider.js","sourceRoot":"","sources":["../../src/providers/Auth0Provider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,gBAAgB;IACjD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAsB;QACjD,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,WAAW,GAAG,CAAC,YAAY,GAAG;YACtC,QAAQ,EAAE,GAAG,CAAC,eAAe;YAC7B,OAAO,EAAE,WAAW,GAAG,CAAC,YAAY,wBAAwB;YAC5D,QAAQ,EAAE,GAAG,CAAC,eAAe;YAC7B,YAAY,EAAE,GAAG,CAAC,mBAAmB;YACrC,MAAM,EAAE,GAAG,CAAC,YAAY;SACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAmB;QACjC,kCAAkC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAwC,IAAI,KAAK,CAAC;QAEpF,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAEvC,OAAO,SAAS,IAAI,WAAW,IAAI,SAAS,CAAC;IAC/C,CAAC;CACF,CAAA;AAzDY,aAAa;IADzB,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC;;GAC5B,aAAa,CAyDzB"}
|
|
@@ -6,6 +6,12 @@ import { BaseAuthProvider } from '../BaseAuthProvider.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export declare class CognitoProvider extends BaseAuthProvider {
|
|
8
8
|
constructor(config: AuthProviderConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Configures Amazon Cognito from COGNITO_USER_POOL_ID + COGNITO_CLIENT_ID + AWS_REGION.
|
|
11
|
+
*
|
|
12
|
+
* Mapping preserved byte-for-byte from the env block that previously lived in MJServer's config.
|
|
13
|
+
*/
|
|
14
|
+
static ConfigFromEnvironment(env: NodeJS.ProcessEnv): AuthProviderConfig | null;
|
|
9
15
|
/**
|
|
10
16
|
* Extracts user information from Cognito JWT payload
|
|
11
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CognitoProvider.d.ts","sourceRoot":"","sources":["../../src/providers/CognitoProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AACH,qBACa,eAAgB,SAAQ,gBAAgB;gBACvC,MAAM,EAAE,kBAAkB;IAItC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY;IAoBlD;;OAEG;IACH,cAAc,IAAI,OAAO;CAQ1B"}
|
|
1
|
+
{"version":3,"file":"CognitoProvider.d.ts","sourceRoot":"","sources":["../../src/providers/CognitoProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AACH,qBACa,eAAgB,SAAQ,gBAAgB;gBACvC,MAAM,EAAE,kBAAkB;IAItC;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,kBAAkB,GAAG,IAAI;IAgB/E;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY;IAoBlD;;OAEG;IACH,cAAc,IAAI,OAAO;CAQ1B"}
|
|
@@ -16,6 +16,26 @@ let CognitoProvider = class CognitoProvider extends BaseAuthProvider {
|
|
|
16
16
|
constructor(config) {
|
|
17
17
|
super(config);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Configures Amazon Cognito from COGNITO_USER_POOL_ID + COGNITO_CLIENT_ID + AWS_REGION.
|
|
21
|
+
*
|
|
22
|
+
* Mapping preserved byte-for-byte from the env block that previously lived in MJServer's config.
|
|
23
|
+
*/
|
|
24
|
+
static ConfigFromEnvironment(env) {
|
|
25
|
+
if (!env.COGNITO_USER_POOL_ID || !env.COGNITO_CLIENT_ID || !env.AWS_REGION) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
name: 'cognito',
|
|
30
|
+
type: 'cognito',
|
|
31
|
+
issuer: `https://cognito-idp.${env.AWS_REGION}.amazonaws.com/${env.COGNITO_USER_POOL_ID}`,
|
|
32
|
+
audience: env.COGNITO_CLIENT_ID,
|
|
33
|
+
jwksUri: `https://cognito-idp.${env.AWS_REGION}.amazonaws.com/${env.COGNITO_USER_POOL_ID}/.well-known/jwks.json`,
|
|
34
|
+
clientId: env.COGNITO_CLIENT_ID,
|
|
35
|
+
region: env.AWS_REGION,
|
|
36
|
+
userPoolId: env.COGNITO_USER_POOL_ID
|
|
37
|
+
};
|
|
38
|
+
}
|
|
19
39
|
/**
|
|
20
40
|
* Extracts user information from Cognito JWT payload
|
|
21
41
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CognitoProvider.js","sourceRoot":"","sources":["../../src/providers/CognitoProvider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,gBAAgB;IACnD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAmB;QACjC,oEAAoE;QACpE,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B;YACnC,OAAO,CAAC,kBAAkB,CAAuB,CAAC;QAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAuB;YAClD,OAAO,CAAC,kBAAwC;YAChD,KAAK,CAAC;QAE/B,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACvC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAE/C,OAAO,SAAS,IAAI,WAAW,IAAI,SAAS,IAAI,aAAa,CAAC;IAChE,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"CognitoProvider.js","sourceRoot":"","sources":["../../src/providers/CognitoProvider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,gBAAgB;IACnD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAsB;QACjD,IAAI,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,uBAAuB,GAAG,CAAC,UAAU,kBAAkB,GAAG,CAAC,oBAAoB,EAAE;YACzF,QAAQ,EAAE,GAAG,CAAC,iBAAiB;YAC/B,OAAO,EAAE,uBAAuB,GAAG,CAAC,UAAU,kBAAkB,GAAG,CAAC,oBAAoB,wBAAwB;YAChH,QAAQ,EAAE,GAAG,CAAC,iBAAiB;YAC/B,MAAM,EAAE,GAAG,CAAC,UAAU;YACtB,UAAU,EAAE,GAAG,CAAC,oBAAoB;SACrC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAmB;QACjC,oEAAoE;QACpE,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B;YACnC,OAAO,CAAC,kBAAkB,CAAuB,CAAC;QAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAuB;YAClD,OAAO,CAAC,kBAAwC;YAChD,KAAK,CAAC;QAE/B,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACvC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAE/C,OAAO,SAAS,IAAI,WAAW,IAAI,SAAS,IAAI,aAAa,CAAC;IAChE,CAAC;CACF,CAAA;AA5DY,eAAe;IAD3B,aAAa,CAAC,gBAAgB,EAAE,SAAS,CAAC;;GAC9B,eAAe,CA4D3B"}
|
|
@@ -6,6 +6,14 @@ import { BaseAuthProvider } from '../BaseAuthProvider.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export declare class MSALProvider extends BaseAuthProvider {
|
|
8
8
|
constructor(config: AuthProviderConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Configures Microsoft Entra ID from TENANT_ID + WEB_CLIENT_ID.
|
|
11
|
+
*
|
|
12
|
+
* Mapping preserved byte-for-byte from the env block that previously lived in MJServer's
|
|
13
|
+
* config — including the provider name 'azure', which predates the Entra rename and is kept
|
|
14
|
+
* so existing deployments' registered provider names do not shift.
|
|
15
|
+
*/
|
|
16
|
+
static ConfigFromEnvironment(env: NodeJS.ProcessEnv): AuthProviderConfig | null;
|
|
9
17
|
/**
|
|
10
18
|
* Extracts user information from MSAL/Azure AD JWT payload
|
|
11
19
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MSALProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MSALProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,qBACa,YAAa,SAAQ,gBAAgB;gBACpC,MAAM,EAAE,kBAAkB;IAItC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY;IAiBlD;;OAEG;IACH,cAAc,IAAI,OAAO;CAO1B"}
|
|
1
|
+
{"version":3,"file":"MSALProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MSALProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,qBACa,YAAa,SAAQ,gBAAgB;gBACpC,MAAM,EAAE,kBAAkB;IAItC;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,kBAAkB,GAAG,IAAI;IAe/E;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY;IAiBlD;;OAEG;IACH,cAAc,IAAI,OAAO;CAO1B"}
|
|
@@ -16,6 +16,27 @@ let MSALProvider = class MSALProvider extends BaseAuthProvider {
|
|
|
16
16
|
constructor(config) {
|
|
17
17
|
super(config);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Configures Microsoft Entra ID from TENANT_ID + WEB_CLIENT_ID.
|
|
21
|
+
*
|
|
22
|
+
* Mapping preserved byte-for-byte from the env block that previously lived in MJServer's
|
|
23
|
+
* config — including the provider name 'azure', which predates the Entra rename and is kept
|
|
24
|
+
* so existing deployments' registered provider names do not shift.
|
|
25
|
+
*/
|
|
26
|
+
static ConfigFromEnvironment(env) {
|
|
27
|
+
if (!env.TENANT_ID || !env.WEB_CLIENT_ID) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
name: 'azure',
|
|
32
|
+
type: 'msal',
|
|
33
|
+
issuer: `https://login.microsoftonline.com/${env.TENANT_ID}/v2.0`,
|
|
34
|
+
audience: env.WEB_CLIENT_ID,
|
|
35
|
+
jwksUri: `https://login.microsoftonline.com/${env.TENANT_ID}/discovery/v2.0/keys`,
|
|
36
|
+
clientId: env.WEB_CLIENT_ID,
|
|
37
|
+
tenantId: env.TENANT_ID
|
|
38
|
+
};
|
|
39
|
+
}
|
|
19
40
|
/**
|
|
20
41
|
* Extracts user information from MSAL/Azure AD JWT payload
|
|
21
42
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MSALProvider.js","sourceRoot":"","sources":["../../src/providers/MSALProvider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,gBAAgB;IAChD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAmB;QACjC,wCAAwC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B,IAAI,OAAO,CAAC,kBAAwC,CAAC;QACtG,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAwC,CAAC;QAE3E,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAE3C,OAAO,SAAS,IAAI,WAAW,IAAI,WAAW,CAAC;IACjD,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"MSALProvider.js","sourceRoot":"","sources":["../../src/providers/MSALProvider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,gBAAgB;IAChD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAsB;QACjD,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,qCAAqC,GAAG,CAAC,SAAS,OAAO;YACjE,QAAQ,EAAE,GAAG,CAAC,aAAa;YAC3B,OAAO,EAAE,qCAAqC,GAAG,CAAC,SAAS,sBAAsB;YACjF,QAAQ,EAAE,GAAG,CAAC,aAAa;YAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAmB;QACjC,wCAAwC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B,IAAI,OAAO,CAAC,kBAAwC,CAAC;QACtG,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAwC,CAAC;QAE3E,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAE3C,OAAO,SAAS,IAAI,WAAW,IAAI,WAAW,CAAC;IACjD,CAAC;CACF,CAAA;AAzDY,YAAY;IADxB,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC;;GAC3B,YAAY,CAyDxB"}
|
|
@@ -6,6 +6,14 @@ import { BaseAuthProvider } from '../BaseAuthProvider.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export declare class OktaProvider extends BaseAuthProvider {
|
|
8
8
|
constructor(config: AuthProviderConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Configures Okta from OKTA_DOMAIN + OKTA_CLIENT_ID, with OKTA_ISSUER overriding the issuer
|
|
11
|
+
* for orgs that use a custom authorization server rather than the default one.
|
|
12
|
+
*
|
|
13
|
+
* NEW capability: Okta had no env-var form before the discovery hook existed — it was one of
|
|
14
|
+
* the providers the old hard-coded block did not cover, so it required a config-file entry.
|
|
15
|
+
*/
|
|
16
|
+
static ConfigFromEnvironment(env: NodeJS.ProcessEnv): AuthProviderConfig | null;
|
|
9
17
|
/**
|
|
10
18
|
* Extracts user information from Okta JWT payload
|
|
11
19
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OktaProvider.d.ts","sourceRoot":"","sources":["../../src/providers/OktaProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AACH,qBACa,YAAa,SAAQ,gBAAgB;gBACpC,MAAM,EAAE,kBAAkB;IAItC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY;IAiBlD;;OAEG;IACH,cAAc,IAAI,OAAO;CAO1B"}
|
|
1
|
+
{"version":3,"file":"OktaProvider.d.ts","sourceRoot":"","sources":["../../src/providers/OktaProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AACH,qBACa,YAAa,SAAQ,gBAAgB;gBACpC,MAAM,EAAE,kBAAkB;IAItC;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,kBAAkB,GAAG,IAAI;IAgB/E;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY;IAiBlD;;OAEG;IACH,cAAc,IAAI,OAAO;CAO1B"}
|
|
@@ -16,6 +16,28 @@ let OktaProvider = class OktaProvider extends BaseAuthProvider {
|
|
|
16
16
|
constructor(config) {
|
|
17
17
|
super(config);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Configures Okta from OKTA_DOMAIN + OKTA_CLIENT_ID, with OKTA_ISSUER overriding the issuer
|
|
21
|
+
* for orgs that use a custom authorization server rather than the default one.
|
|
22
|
+
*
|
|
23
|
+
* NEW capability: Okta had no env-var form before the discovery hook existed — it was one of
|
|
24
|
+
* the providers the old hard-coded block did not cover, so it required a config-file entry.
|
|
25
|
+
*/
|
|
26
|
+
static ConfigFromEnvironment(env) {
|
|
27
|
+
if (!env.OKTA_DOMAIN || !env.OKTA_CLIENT_ID) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const issuer = env.OKTA_ISSUER || `https://${env.OKTA_DOMAIN}/oauth2/default`;
|
|
31
|
+
return {
|
|
32
|
+
name: 'okta',
|
|
33
|
+
type: 'okta',
|
|
34
|
+
issuer,
|
|
35
|
+
audience: env.OKTA_AUDIENCE || env.OKTA_CLIENT_ID,
|
|
36
|
+
jwksUri: `${issuer.replace(/\/$/, '')}/v1/keys`,
|
|
37
|
+
clientId: env.OKTA_CLIENT_ID,
|
|
38
|
+
domain: env.OKTA_DOMAIN
|
|
39
|
+
};
|
|
40
|
+
}
|
|
19
41
|
/**
|
|
20
42
|
* Extracts user information from Okta JWT payload
|
|
21
43
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OktaProvider.js","sourceRoot":"","sources":["../../src/providers/OktaProvider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,gBAAgB;IAChD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAmB;QACjC,uDAAuD;QACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B,IAAI,OAAO,CAAC,kBAAwC,CAAC;QACtG,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAwC,IAAI,KAAK,CAAC;QAEpF,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAEvC,OAAO,SAAS,IAAI,WAAW,IAAI,SAAS,CAAC;IAC/C,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"OktaProvider.js","sourceRoot":"","sources":["../../src/providers/OktaProvider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,gBAAgB;IAChD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAsB;QACjD,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,WAAW,GAAG,CAAC,WAAW,iBAAiB,CAAC;QAC9E,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,MAAM;YACZ,MAAM;YACN,QAAQ,EAAE,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,cAAc;YACjD,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU;YAC/C,QAAQ,EAAE,GAAG,CAAC,cAAc;YAC5B,MAAM,EAAE,GAAG,CAAC,WAAW;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAmB;QACjC,uDAAuD;QACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B,IAAI,OAAO,CAAC,kBAAwC,CAAC;QACtG,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAwC,IAAI,KAAK,CAAC;QAEpF,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAEvC,OAAO,SAAS,IAAI,WAAW,IAAI,SAAS,CAAC;IAC/C,CAAC;CACF,CAAA;AA1DY,YAAY;IADxB,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC;;GAC3B,YAAY,CA0DxB"}
|
|
@@ -27,6 +27,20 @@ import { BaseAuthProvider } from '../BaseAuthProvider.js';
|
|
|
27
27
|
*/
|
|
28
28
|
export declare class WorkOSProvider extends BaseAuthProvider {
|
|
29
29
|
constructor(config: AuthProviderConfig);
|
|
30
|
+
/**
|
|
31
|
+
* Configures WorkOS AuthKit from WORKOS_CLIENT_ID.
|
|
32
|
+
*
|
|
33
|
+
* Issuer and JWKS are both derived from the client ID — AuthKit's issuer is
|
|
34
|
+
* https://api.workos.com/user_management/<clientId> and its JWKS lives at
|
|
35
|
+
* https://api.workos.com/sso/jwks/<clientId> — so a single variable is enough.
|
|
36
|
+
* WORKOS_AUDIENCE overrides the audience when a Resource Indicator is configured.
|
|
37
|
+
*
|
|
38
|
+
* NEW capability: WorkOS had no env-var form before the discovery hook existed.
|
|
39
|
+
*
|
|
40
|
+
* Remember the AuthKit email caveat: access tokens omit `email` unless a JWT Template adds it,
|
|
41
|
+
* and MJ resolves users by email. See WORKOS.md.
|
|
42
|
+
*/
|
|
43
|
+
static ConfigFromEnvironment(env: NodeJS.ProcessEnv): AuthProviderConfig | null;
|
|
30
44
|
/**
|
|
31
45
|
* Extracts user information from a WorkOS AuthKit JWT payload.
|
|
32
46
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkOSProvider.d.ts","sourceRoot":"","sources":["../../src/providers/WorkOSProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBACa,cAAe,SAAQ,gBAAgB;gBACtC,MAAM,EAAE,kBAAkB;IAItC;;;;;;;OAOG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY;IAoBlD;;;;;;OAMG;IACH,cAAc,IAAI,OAAO;CAM1B"}
|
|
1
|
+
{"version":3,"file":"WorkOSProvider.d.ts","sourceRoot":"","sources":["../../src/providers/WorkOSProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBACa,cAAe,SAAQ,gBAAgB;gBACtC,MAAM,EAAE,kBAAkB;IAItC;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,kBAAkB,GAAG,IAAI;IAc/E;;;;;;;OAOG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY;IAoBlD;;;;;;OAMG;IACH,cAAc,IAAI,OAAO;CAM1B"}
|
|
@@ -37,6 +37,32 @@ let WorkOSProvider = class WorkOSProvider extends BaseAuthProvider {
|
|
|
37
37
|
constructor(config) {
|
|
38
38
|
super(config);
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Configures WorkOS AuthKit from WORKOS_CLIENT_ID.
|
|
42
|
+
*
|
|
43
|
+
* Issuer and JWKS are both derived from the client ID — AuthKit's issuer is
|
|
44
|
+
* https://api.workos.com/user_management/<clientId> and its JWKS lives at
|
|
45
|
+
* https://api.workos.com/sso/jwks/<clientId> — so a single variable is enough.
|
|
46
|
+
* WORKOS_AUDIENCE overrides the audience when a Resource Indicator is configured.
|
|
47
|
+
*
|
|
48
|
+
* NEW capability: WorkOS had no env-var form before the discovery hook existed.
|
|
49
|
+
*
|
|
50
|
+
* Remember the AuthKit email caveat: access tokens omit `email` unless a JWT Template adds it,
|
|
51
|
+
* and MJ resolves users by email. See WORKOS.md.
|
|
52
|
+
*/
|
|
53
|
+
static ConfigFromEnvironment(env) {
|
|
54
|
+
if (!env.WORKOS_CLIENT_ID) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
name: 'workos',
|
|
59
|
+
type: 'workos',
|
|
60
|
+
issuer: `https://api.workos.com/user_management/${env.WORKOS_CLIENT_ID}`,
|
|
61
|
+
audience: env.WORKOS_AUDIENCE || env.WORKOS_CLIENT_ID,
|
|
62
|
+
jwksUri: `https://api.workos.com/sso/jwks/${env.WORKOS_CLIENT_ID}`,
|
|
63
|
+
clientId: env.WORKOS_CLIENT_ID
|
|
64
|
+
};
|
|
65
|
+
}
|
|
40
66
|
/**
|
|
41
67
|
* Extracts user information from a WorkOS AuthKit JWT payload.
|
|
42
68
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkOSProvider.js","sourceRoot":"","sources":["../../src/providers/WorkOSProvider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,gBAAgB;IAClD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CAAC,OAAmB;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,kFAAkF;QAClF,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAwC,IAAI,KAAK,CAAC;QACpF,4DAA4D;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAyB,CAAC;QAEjD,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;YACjB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAE3C,OAAO,SAAS,IAAI,WAAW,CAAC;IAClC,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"WorkOSProvider.js","sourceRoot":"","sources":["../../src/providers/WorkOSProvider.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,gBAAgB;IAClD,YAAY,MAA0B;QACpC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAsB;QACjD,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,0CAA0C,GAAG,CAAC,gBAAgB,EAAE;YACxE,QAAQ,EAAE,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,gBAAgB;YACrD,OAAO,EAAE,mCAAmC,GAAG,CAAC,gBAAgB,EAAE;YAClE,QAAQ,EAAE,GAAG,CAAC,gBAAgB;SAC/B,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CAAC,OAAmB;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2B,CAAC;QAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QACpD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAgC,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAiC,CAAC;QAC3D,kFAAkF;QAClF,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAwC,IAAI,KAAK,CAAC;QACpF,4DAA4D;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAyB,CAAC;QAEjD,OAAO;YACL,KAAK;YACL,SAAS,EAAE,SAAS,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,QAAQ;YACR,iBAAiB;YACjB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,cAAc;QACZ,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAE3C,OAAO,SAAS,IAAI,WAAW,CAAC;IAClC,CAAC;CACF,CAAA;AAzEY,cAAc;IAD1B,aAAa,CAAC,gBAAgB,EAAE,QAAQ,CAAC;;GAC7B,cAAc,CAyE1B"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/auth-providers",
|
|
3
|
-
"
|
|
3
|
+
"license": "BUSL-1.1",
|
|
4
|
+
"version": "6.1.0-edge.3",
|
|
4
5
|
"description": "Authentication provider interfaces, base classes, and implementations for MemberJunction",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "./dist/index.js",
|
|
7
8
|
"types": "./dist/index.d.ts",
|
|
8
9
|
"dependencies": {
|
|
9
|
-
"@memberjunction/core": "6.1.0-edge.
|
|
10
|
-
"@memberjunction/global": "6.1.0-edge.
|
|
10
|
+
"@memberjunction/core": "6.1.0-edge.3",
|
|
11
|
+
"@memberjunction/global": "6.1.0-edge.3",
|
|
11
12
|
"graphql": "^16.12.0",
|
|
12
13
|
"jsonwebtoken": "9.0.3",
|
|
13
14
|
"jwks-rsa": "^3.2.2"
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import { AuthProviderConfig, LogStatusEx } from '@memberjunction/core';
|
|
2
2
|
import { IAuthProvider } from './IAuthProvider.js';
|
|
3
3
|
import { BaseAuthProvider } from './BaseAuthProvider.js';
|
|
4
|
+
import { isEnvironmentConfigurable } from './IEnvironmentConfigurableProvider.js';
|
|
4
5
|
import { MJGlobal, BaseSingleton, MJLruCache } from '@memberjunction/global';
|
|
5
6
|
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import './providers/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
// NOTE: this file deliberately contains NO list of concrete providers.
|
|
8
|
+
//
|
|
9
|
+
// It used to carry a literal `import './providers/Auth0Provider.js'` roster, which made the
|
|
10
|
+
// built-ins look like a closed set that had to be edited to add a provider. They never were:
|
|
11
|
+
// providers are @RegisterClass plugins resolved by key, and `index.ts` already exports all of
|
|
12
|
+
// them by name, so importing anything from '@memberjunction/auth-providers' loads and registers
|
|
13
|
+
// every built-in. HostIdentityProvider — added later — was never in that roster and has always
|
|
14
|
+
// registered fine through the package entry point and the server-bootstrap manifest, which is
|
|
15
|
+
// the proof the roster was redundant rather than load-bearing.
|
|
16
|
+
//
|
|
17
|
+
// Adding a provider is therefore: ship a @RegisterClass(BaseAuthProvider, 'x') subclass (in this
|
|
18
|
+
// package, or in any package covered by a class-registration manifest) and add an
|
|
19
|
+
// `MJ: Authentication Providers` row naming 'x' as its DriverClass. No edit here.
|
|
14
20
|
|
|
15
21
|
/**
|
|
16
22
|
* Factory and registry for managing authentication providers
|
|
@@ -182,6 +188,48 @@ export class AuthProviderFactory extends BaseSingleton<AuthProviderFactory> {
|
|
|
182
188
|
return Array.from(new Set(providerTypes));
|
|
183
189
|
}
|
|
184
190
|
|
|
191
|
+
/**
|
|
192
|
+
* Collects provider configurations from environment variables by asking every registered
|
|
193
|
+
* provider class to configure itself.
|
|
194
|
+
*
|
|
195
|
+
* This replaces the hard-coded env block that used to live in MJServer's config and
|
|
196
|
+
* enumerated Entra / Auth0 / Cognito inline. Discovery is now driven by the same
|
|
197
|
+
* `@RegisterClass` registry that resolves drivers, so a third-party provider gets the
|
|
198
|
+
* env-var experience without a core edit — see {@link IEnvironmentConfigurableProvider}.
|
|
199
|
+
*
|
|
200
|
+
* A provider whose variables are absent returns null and is skipped. A provider whose
|
|
201
|
+
* mapping throws is skipped with an error rather than taking down startup, because one
|
|
202
|
+
* malformed mapping must not cost a deployment its other providers.
|
|
203
|
+
*
|
|
204
|
+
* @param env Environment to read from; defaults to `process.env`.
|
|
205
|
+
* @returns One config per provider that found its variables, deduplicated by name.
|
|
206
|
+
*/
|
|
207
|
+
static DiscoverFromEnvironment(env: NodeJS.ProcessEnv = process.env): AuthProviderConfig[] {
|
|
208
|
+
const registrations = MJGlobal.Instance.ClassFactory.GetAllRegistrations(BaseAuthProvider);
|
|
209
|
+
const configs = new Map<string, AuthProviderConfig>();
|
|
210
|
+
|
|
211
|
+
for (const registration of registrations) {
|
|
212
|
+
const providerClass: unknown = registration.SubClass;
|
|
213
|
+
if (!isEnvironmentConfigurable(providerClass)) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
const config = providerClass.ConfigFromEnvironment(env);
|
|
218
|
+
if (config && !configs.has(config.name)) {
|
|
219
|
+
configs.set(config.name, config);
|
|
220
|
+
}
|
|
221
|
+
} catch (error) {
|
|
222
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
223
|
+
LogStatusEx({
|
|
224
|
+
message: `Auth provider '${registration.Key}' failed to build a configuration from environment variables: ${message}`,
|
|
225
|
+
verboseOnly: true
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return Array.from(configs.values());
|
|
231
|
+
}
|
|
232
|
+
|
|
185
233
|
/**
|
|
186
234
|
* Checks if a provider type is registered
|
|
187
235
|
*/
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AuthProviderConfig } from '@memberjunction/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Optional static contract a provider class implements to configure itself from environment
|
|
5
|
+
* variables.
|
|
6
|
+
*
|
|
7
|
+
* **Why this is a hook and not a list.** MJServer used to derive env-based providers from a
|
|
8
|
+
* hard-coded block that enumerated Entra, Auth0 and Cognito inline. That block was a closed
|
|
9
|
+
* domain in the one place the architecture is otherwise open: a third-party provider could
|
|
10
|
+
* register a class and take a metadata row or a `mj.config.cjs` entry, but it could never offer
|
|
11
|
+
* the "set two environment variables and you are done" experience the built-ins got, because
|
|
12
|
+
* the enumeration lived in core. Moving the mapping onto the provider class puts every provider
|
|
13
|
+
* — shipped or third-party — on the same footing.
|
|
14
|
+
*
|
|
15
|
+
* A provider that has no meaningful env-var form simply omits the static, and discovery skips it.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* @RegisterClass(BaseAuthProvider, 'my-idp')
|
|
20
|
+
* export class MyIdpProvider extends BaseAuthProvider {
|
|
21
|
+
* static ConfigFromEnvironment(env: NodeJS.ProcessEnv): AuthProviderConfig | null {
|
|
22
|
+
* if (!env.MY_IDP_DOMAIN || !env.MY_IDP_CLIENT_ID) return null;
|
|
23
|
+
* return {
|
|
24
|
+
* name: 'my-idp',
|
|
25
|
+
* type: 'my-idp',
|
|
26
|
+
* issuer: `https://${env.MY_IDP_DOMAIN}/`,
|
|
27
|
+
* audience: env.MY_IDP_CLIENT_ID,
|
|
28
|
+
* jwksUri: `https://${env.MY_IDP_DOMAIN}/.well-known/jwks.json`,
|
|
29
|
+
* clientId: env.MY_IDP_CLIENT_ID
|
|
30
|
+
* };
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export interface IEnvironmentConfigurableProvider {
|
|
36
|
+
/**
|
|
37
|
+
* Builds this provider's configuration from environment variables.
|
|
38
|
+
*
|
|
39
|
+
* MUST return `null` — not a partial config — when its variables are absent or incomplete.
|
|
40
|
+
* A half-populated config would fail `validateConfig()` at registration and surface as a
|
|
41
|
+
* startup error on every deployment that simply does not use this provider.
|
|
42
|
+
*
|
|
43
|
+
* @param env The environment to read (injected rather than read from `process.env` directly
|
|
44
|
+
* so the mapping is testable without mutating global state).
|
|
45
|
+
*/
|
|
46
|
+
ConfigFromEnvironment(env: NodeJS.ProcessEnv): AuthProviderConfig | null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Narrows an unknown provider class to one that offers env-var configuration.
|
|
51
|
+
*/
|
|
52
|
+
export function isEnvironmentConfigurable(subject: unknown): subject is IEnvironmentConfigurableProvider {
|
|
53
|
+
return typeof (subject as IEnvironmentConfigurableProvider | undefined)?.ConfigFromEnvironment === 'function';
|
|
54
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locks in the invariant that `AuthProviderFactory` now depends on.
|
|
3
|
+
*
|
|
4
|
+
* The factory used to carry a literal `import './providers/Auth0Provider.js'` roster to force
|
|
5
|
+
* registration. That roster was removed because it made the built-ins look like a closed set
|
|
6
|
+
* that had to be edited to add a provider — registration actually comes from importing the
|
|
7
|
+
* package ENTRY POINT, which exports every provider by name.
|
|
8
|
+
*
|
|
9
|
+
* That makes `index.ts` load-bearing in a way nothing previously asserted: dropping a provider's
|
|
10
|
+
* export would silently stop registering it, and the failure would surface only as production
|
|
11
|
+
* tokens from that issuer being rejected. These tests import the entry point exactly as every
|
|
12
|
+
* real consumer does, and fail loudly if an export goes missing.
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it, expect } from 'vitest';
|
|
15
|
+
|
|
16
|
+
// Import the package entry point (NOT a deep path) — this is the behaviour under test.
|
|
17
|
+
import { AuthProviderFactory } from '../index.js';
|
|
18
|
+
|
|
19
|
+
/** Every driver key MJ ships, matching the @RegisterClass keys on the concrete providers. */
|
|
20
|
+
const BUILT_IN_DRIVER_KEYS = ['auth0', 'msal', 'okta', 'cognito', 'google', 'workos', 'magic-link'] as const;
|
|
21
|
+
|
|
22
|
+
describe('built-in auth provider registration via the package entry point', () => {
|
|
23
|
+
it.each(BUILT_IN_DRIVER_KEYS)("registers the '%s' driver", (key) => {
|
|
24
|
+
expect(AuthProviderFactory.isProviderTypeRegistered(key)).toBe(true);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('exposes every built-in driver key through the ClassFactory', () => {
|
|
28
|
+
const registered = AuthProviderFactory.getRegisteredProviderTypes();
|
|
29
|
+
for (const key of BUILT_IN_DRIVER_KEYS) {
|
|
30
|
+
expect(registered).toContain(key);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('reports an unregistered driver key as unregistered', () => {
|
|
35
|
+
expect(AuthProviderFactory.isProviderTypeRegistered('not-a-real-provider')).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for environment-variable provider discovery.
|
|
3
|
+
*
|
|
4
|
+
* The mappings for Entra, Auth0 and Cognito were lifted out of a hard-coded block in MJServer's
|
|
5
|
+
* config and onto the provider classes. The parity tests below assert the exact shape that block
|
|
6
|
+
* produced, because any drift silently changes which issuer a deployment's tokens are validated
|
|
7
|
+
* against — a failure that surfaces as "everyone is logged out" rather than as a type error.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from 'vitest';
|
|
10
|
+
import { AuthProviderFactory } from '../index.js';
|
|
11
|
+
import { Auth0Provider } from '../providers/Auth0Provider.js';
|
|
12
|
+
import { MSALProvider } from '../providers/MSALProvider.js';
|
|
13
|
+
import { CognitoProvider } from '../providers/CognitoProvider.js';
|
|
14
|
+
import { OktaProvider } from '../providers/OktaProvider.js';
|
|
15
|
+
import { WorkOSProvider } from '../providers/WorkOSProvider.js';
|
|
16
|
+
|
|
17
|
+
const EMPTY: NodeJS.ProcessEnv = {};
|
|
18
|
+
|
|
19
|
+
describe('ConfigFromEnvironment — parity with the previous hard-coded block', () => {
|
|
20
|
+
it('Auth0 maps AUTH0_DOMAIN + AUTH0_CLIENT_ID exactly as before', () => {
|
|
21
|
+
expect(
|
|
22
|
+
Auth0Provider.ConfigFromEnvironment({
|
|
23
|
+
AUTH0_DOMAIN: 'example.us.auth0.com',
|
|
24
|
+
AUTH0_CLIENT_ID: 'cid',
|
|
25
|
+
AUTH0_CLIENT_SECRET: 'secret'
|
|
26
|
+
})
|
|
27
|
+
).toEqual({
|
|
28
|
+
name: 'auth0',
|
|
29
|
+
type: 'auth0',
|
|
30
|
+
issuer: 'https://example.us.auth0.com/',
|
|
31
|
+
audience: 'cid',
|
|
32
|
+
jwksUri: 'https://example.us.auth0.com/.well-known/jwks.json',
|
|
33
|
+
clientId: 'cid',
|
|
34
|
+
clientSecret: 'secret',
|
|
35
|
+
domain: 'example.us.auth0.com'
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('Entra maps TENANT_ID + WEB_CLIENT_ID exactly as before, keeping the legacy name "azure"', () => {
|
|
40
|
+
const config = MSALProvider.ConfigFromEnvironment({ TENANT_ID: 'tid', WEB_CLIENT_ID: 'wcid' });
|
|
41
|
+
expect(config).toEqual({
|
|
42
|
+
name: 'azure',
|
|
43
|
+
type: 'msal',
|
|
44
|
+
issuer: 'https://login.microsoftonline.com/tid/v2.0',
|
|
45
|
+
audience: 'wcid',
|
|
46
|
+
jwksUri: 'https://login.microsoftonline.com/tid/discovery/v2.0/keys',
|
|
47
|
+
clientId: 'wcid',
|
|
48
|
+
tenantId: 'tid'
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('Cognito maps its three variables exactly as before', () => {
|
|
53
|
+
expect(
|
|
54
|
+
CognitoProvider.ConfigFromEnvironment({
|
|
55
|
+
COGNITO_USER_POOL_ID: 'pool',
|
|
56
|
+
COGNITO_CLIENT_ID: 'ccid',
|
|
57
|
+
AWS_REGION: 'us-east-1'
|
|
58
|
+
})
|
|
59
|
+
).toEqual({
|
|
60
|
+
name: 'cognito',
|
|
61
|
+
type: 'cognito',
|
|
62
|
+
issuer: 'https://cognito-idp.us-east-1.amazonaws.com/pool',
|
|
63
|
+
audience: 'ccid',
|
|
64
|
+
jwksUri: 'https://cognito-idp.us-east-1.amazonaws.com/pool/.well-known/jwks.json',
|
|
65
|
+
clientId: 'ccid',
|
|
66
|
+
region: 'us-east-1',
|
|
67
|
+
userPoolId: 'pool'
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('ConfigFromEnvironment — incomplete configuration', () => {
|
|
73
|
+
it.each([
|
|
74
|
+
['Auth0 without a client id', () => Auth0Provider.ConfigFromEnvironment({ AUTH0_DOMAIN: 'd' })],
|
|
75
|
+
['Entra without a client id', () => MSALProvider.ConfigFromEnvironment({ TENANT_ID: 't' })],
|
|
76
|
+
['Cognito without a region', () => CognitoProvider.ConfigFromEnvironment({ COGNITO_USER_POOL_ID: 'p', COGNITO_CLIENT_ID: 'c' })],
|
|
77
|
+
['Okta without a client id', () => OktaProvider.ConfigFromEnvironment({ OKTA_DOMAIN: 'd' })],
|
|
78
|
+
['WorkOS with nothing set', () => WorkOSProvider.ConfigFromEnvironment(EMPTY)]
|
|
79
|
+
])('returns null for %s rather than a partial config', (_label, build) => {
|
|
80
|
+
// A partial config would fail validateConfig() at registration and surface as a startup
|
|
81
|
+
// error on every deployment that simply does not use that provider.
|
|
82
|
+
expect(build()).toBeNull();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
describe('ConfigFromEnvironment — providers that previously had no env-var form', () => {
|
|
87
|
+
it('Okta derives the default authorization server, and honours OKTA_ISSUER', () => {
|
|
88
|
+
const base = OktaProvider.ConfigFromEnvironment({ OKTA_DOMAIN: 'org.okta.com', OKTA_CLIENT_ID: 'ocid' });
|
|
89
|
+
expect(base?.issuer).toBe('https://org.okta.com/oauth2/default');
|
|
90
|
+
expect(base?.jwksUri).toBe('https://org.okta.com/oauth2/default/v1/keys');
|
|
91
|
+
|
|
92
|
+
const custom = OktaProvider.ConfigFromEnvironment({
|
|
93
|
+
OKTA_DOMAIN: 'org.okta.com',
|
|
94
|
+
OKTA_CLIENT_ID: 'ocid',
|
|
95
|
+
OKTA_ISSUER: 'https://org.okta.com/oauth2/aus123'
|
|
96
|
+
});
|
|
97
|
+
expect(custom?.issuer).toBe('https://org.okta.com/oauth2/aus123');
|
|
98
|
+
expect(custom?.jwksUri).toBe('https://org.okta.com/oauth2/aus123/v1/keys');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('WorkOS derives issuer and JWKS from the client id alone', () => {
|
|
102
|
+
const config = WorkOSProvider.ConfigFromEnvironment({ WORKOS_CLIENT_ID: 'client_01H' });
|
|
103
|
+
expect(config).toMatchObject({
|
|
104
|
+
name: 'workos',
|
|
105
|
+
type: 'workos',
|
|
106
|
+
issuer: 'https://api.workos.com/user_management/client_01H',
|
|
107
|
+
jwksUri: 'https://api.workos.com/sso/jwks/client_01H',
|
|
108
|
+
audience: 'client_01H'
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('AuthProviderFactory.DiscoverFromEnvironment', () => {
|
|
114
|
+
it('returns nothing for an empty environment', () => {
|
|
115
|
+
expect(AuthProviderFactory.DiscoverFromEnvironment(EMPTY)).toEqual([]);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('discovers every provider whose variables are present, through the ClassFactory registry', () => {
|
|
119
|
+
const discovered = AuthProviderFactory.DiscoverFromEnvironment({
|
|
120
|
+
AUTH0_DOMAIN: 'example.us.auth0.com',
|
|
121
|
+
AUTH0_CLIENT_ID: 'a',
|
|
122
|
+
TENANT_ID: 't',
|
|
123
|
+
WEB_CLIENT_ID: 'w',
|
|
124
|
+
WORKOS_CLIENT_ID: 'client_01H'
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
expect(discovered.map((p) => p.name).sort()).toEqual(['auth0', 'azure', 'workos']);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('skips providers whose variables are absent', () => {
|
|
131
|
+
const discovered = AuthProviderFactory.DiscoverFromEnvironment({ AUTH0_DOMAIN: 'd', AUTH0_CLIENT_ID: 'c' });
|
|
132
|
+
expect(discovered.map((p) => p.name)).toEqual(['auth0']);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('produces configs that pass the provider validity check', () => {
|
|
136
|
+
for (const config of AuthProviderFactory.DiscoverFromEnvironment({
|
|
137
|
+
AUTH0_DOMAIN: 'example.us.auth0.com',
|
|
138
|
+
AUTH0_CLIENT_ID: 'a',
|
|
139
|
+
OKTA_DOMAIN: 'org.okta.com',
|
|
140
|
+
OKTA_CLIENT_ID: 'o',
|
|
141
|
+
WORKOS_CLIENT_ID: 'client_01H'
|
|
142
|
+
})) {
|
|
143
|
+
expect(AuthProviderFactory.createProvider(config).validateConfig()).toBe(true);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { IAuthProvider } from './IAuthProvider.js';
|
|
|
2
2
|
export { BaseAuthProvider } from './BaseAuthProvider.js';
|
|
3
3
|
export { AuthProviderFactory } from './AuthProviderFactory.js';
|
|
4
4
|
export { TokenExpiredError } from './tokenExpiredError.js';
|
|
5
|
+
export { type IEnvironmentConfigurableProvider, isEnvironmentConfigurable } from './IEnvironmentConfigurableProvider.js';
|
|
5
6
|
export { MagicLinkProvider } from './providers/MagicLinkProvider.js';
|
|
6
7
|
export {
|
|
7
8
|
HostIdentityProvider,
|