@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.
Files changed (47) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +61 -0
  3. package/LICENSE +180 -4
  4. package/README.md +71 -2
  5. package/dist/AuthProviderFactory.d.ts +17 -7
  6. package/dist/AuthProviderFactory.d.ts.map +1 -1
  7. package/dist/AuthProviderFactory.js +54 -8
  8. package/dist/AuthProviderFactory.js.map +1 -1
  9. package/dist/IEnvironmentConfigurableProvider.d.ts +51 -0
  10. package/dist/IEnvironmentConfigurableProvider.d.ts.map +1 -0
  11. package/dist/IEnvironmentConfigurableProvider.js +7 -0
  12. package/dist/IEnvironmentConfigurableProvider.js.map +1 -0
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/providers/Auth0Provider.d.ts +7 -0
  18. package/dist/providers/Auth0Provider.d.ts.map +1 -1
  19. package/dist/providers/Auth0Provider.js +21 -0
  20. package/dist/providers/Auth0Provider.js.map +1 -1
  21. package/dist/providers/CognitoProvider.d.ts +6 -0
  22. package/dist/providers/CognitoProvider.d.ts.map +1 -1
  23. package/dist/providers/CognitoProvider.js +20 -0
  24. package/dist/providers/CognitoProvider.js.map +1 -1
  25. package/dist/providers/MSALProvider.d.ts +8 -0
  26. package/dist/providers/MSALProvider.d.ts.map +1 -1
  27. package/dist/providers/MSALProvider.js +21 -0
  28. package/dist/providers/MSALProvider.js.map +1 -1
  29. package/dist/providers/OktaProvider.d.ts +8 -0
  30. package/dist/providers/OktaProvider.d.ts.map +1 -1
  31. package/dist/providers/OktaProvider.js +22 -0
  32. package/dist/providers/OktaProvider.js.map +1 -1
  33. package/dist/providers/WorkOSProvider.d.ts +14 -0
  34. package/dist/providers/WorkOSProvider.d.ts.map +1 -1
  35. package/dist/providers/WorkOSProvider.js +26 -0
  36. package/dist/providers/WorkOSProvider.js.map +1 -1
  37. package/package.json +4 -3
  38. package/src/AuthProviderFactory.ts +56 -8
  39. package/src/IEnvironmentConfigurableProvider.ts +54 -0
  40. package/src/__tests__/BuiltInProviderRegistration.test.ts +37 -0
  41. package/src/__tests__/EnvironmentDiscovery.test.ts +146 -0
  42. package/src/index.ts +1 -0
  43. package/src/providers/Auth0Provider.ts +22 -0
  44. package/src/providers/CognitoProvider.ts +21 -0
  45. package/src/providers/MSALProvider.ts +22 -0
  46. package/src/providers/OktaProvider.ts +23 -0
  47. 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;AAnCY,aAAa;IADzB,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC;;GAC5B,aAAa,CAmCzB"}
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;AAvCY,eAAe;IAD3B,aAAa,CAAC,gBAAgB,EAAE,SAAS,CAAC;;GAC9B,eAAe,CAuC3B"}
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;AAnCY,YAAY;IADxB,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC;;GAC3B,YAAY,CAmCxB"}
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;AAnCY,YAAY;IADxB,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC;;GAC3B,YAAY,CAmCxB"}
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;AA9CY,cAAc;IAD1B,aAAa,CAAC,gBAAgB,EAAE,QAAQ,CAAC;;GAC7B,cAAc,CA8C1B"}
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
- "version": "6.1.0-edge.2",
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.2",
10
- "@memberjunction/global": "6.1.0-edge.2",
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
- // Import providers to ensure they're registered
7
- import './providers/Auth0Provider.js';
8
- import './providers/MSALProvider.js';
9
- import './providers/OktaProvider.js';
10
- import './providers/CognitoProvider.js';
11
- import './providers/GoogleProvider.js';
12
- import './providers/WorkOSProvider.js';
13
- import './providers/MagicLinkProvider.js';
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,