@owlmeans/web-auth 0.1.18-rc.2 → 0.1.18-rc.20

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@owlmeans/web-auth",
4
- "version": "0.1.18-rc.0",
5
- "generatedAt": "2026-08-16T22:20:50.505Z",
4
+ "version": "0.1.18-rc.20",
5
+ "generatedAt": "2026-09-01T12:30:48.601Z",
6
6
  "canonicalRepo": "https://github.com/owlmeans/common",
7
7
  "entries": [
8
8
  {
@@ -8,7 +8,7 @@ user-invocable: false
8
8
  # @owlmeans/web-auth
9
9
 
10
10
  **Layer:** Web
11
- **Install:** `"@owlmeans/web-auth": "^0.1.18-rc.0"` in `dependencies`
11
+ **Install:** `"@owlmeans/web-auth": "^0.1.18-rc.20"` in `dependencies`
12
12
 
13
13
  Web-side auth UI plugins that register into the shared `@owlmeans/client-auth/manager` plugin registry
14
14
  (mirrors `@owlmeans/web-oidc-rp`). Currently ships the **PK-based supervisor** login form.
@@ -29,8 +29,19 @@ Web-side auth UI plugins that register into the shared `@owlmeans/client-auth/ma
29
29
  ```ts
30
30
  import { appendSupervisorAuth } from '@owlmeans/web-auth'
31
31
  // in your web client makeContext():
32
- appendSupervisorAuth(context) // enabled in development only (cfg.debug)
32
+ appendSupervisorAuth(context) // enabled where cfg.debug.supervisor === true
33
33
  ```
34
+
35
+ **It reads `cfg.debug.supervisor`, and deliberately NOT `cfg.debug.all`.** Whole families of
36
+ OwlMeans applications set `debug.all` for reasons that have nothing to do with authentication — a
37
+ Viable-generated target sets it for itself — so gating on it put an operator login on every one of
38
+ them, in production, reachable by anyone who typed the URL. `{ enabled: true }` forces it on for a
39
+ consumer that relied on the old default.
40
+
41
+ Registering the plugin is not enough to make it OFFERED: `supervisorClientPlugin` carries
42
+ `restricted: true`, so the sign-in screen shows it only where the configuration names it. That is
43
+ what `appendSupervisorAuth` writes into `cfg.security.auth.login.overrides` when it enables the
44
+ plugin — pass `{ offer: false }` to register it without advertising it.
34
45
  The form renders at `SUPERVISOR_LOGIN_PATH` via the standard `CAUTHEN_AUTHEN_TYPED` route — no extra
35
46
  route registration needed. Test ids: `supervisor-auth-form`, `supervisor-user-id`, `supervisor-pk`,
36
47
  `supervisor-submit`, `supervisor-error`.
package/build/append.d.ts CHANGED
@@ -1,19 +1,28 @@
1
+ import type { CommonConfig } from '@owlmeans/config';
1
2
  export interface WebSupervisorAuthOptions {
2
- /** Force enable/disable. Default: development only (cfg.debug.all || cfg.debug.supervisor). */
3
+ /** Force enable/disable. Default: `cfg.debug.supervisor === true`. */
3
4
  enabled?: boolean;
5
+ /**
6
+ * Also offer it on the sign-in screen. Defaults to true — an operator login that is registered
7
+ * but reachable only by typing its URL is a login nobody finds and an exposure nobody sees.
8
+ */
9
+ offer?: boolean;
4
10
  }
5
- /**
6
- * Unified, explicit append for the PK-based supervisor login UI. Call it once on
7
- * the web client context. Development-only by default. It registers the
8
- * supervisor client plugin so the form is rendered by the standard typed
9
- * authentication route at {@link SUPERVISOR_LOGIN_PATH}.
10
- */
11
- export declare const appendSupervisorAuth: <T extends {
11
+ interface DebugCarrier {
12
12
  cfg: {
13
13
  debug?: {
14
14
  all?: boolean;
15
15
  supervisor?: boolean;
16
16
  };
17
+ security?: CommonConfig['security'];
17
18
  };
18
- }>(context: T, opts?: WebSupervisorAuthOptions) => T;
19
+ }
20
+ /**
21
+ * Unified, explicit append for the PK-based supervisor login UI. Call it once on the web client
22
+ * context. It registers the supervisor client plugin so the form is rendered by the standard typed
23
+ * authentication route at {@link SUPERVISOR_LOGIN_PATH}, and enables it in the sign-in screen's
24
+ * configuration — which is what turns a `restricted` method from registered into offerable.
25
+ */
26
+ export declare const appendSupervisorAuth: <T extends DebugCarrier>(context: T, opts?: WebSupervisorAuthOptions) => T;
27
+ export {};
19
28
  //# sourceMappingURL=append.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,wBAAwB;IACvC,+FAA+F;IAC/F,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAKD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS;IAAE,GAAG,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,OAAO,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,WAChG,CAAC,SAAS,wBAAwB,KAC1C,CASF,CAAA"}
1
+ {"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAGpD,MAAM,WAAW,wBAAwB;IACvC,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,UAAU,YAAY;IACpB,GAAG,EAAE;QACH,KAAK,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,OAAO,CAAC;YAAC,UAAU,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;QAC/C,QAAQ,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,CAAA;KACpC,CAAA;CACF;AAcD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,YAAY,WAChD,CAAC,SAAS,wBAAwB,KAC1C,CAoBF,CAAA"}
package/build/append.js CHANGED
@@ -1,19 +1,38 @@
1
1
  import { AuthenticationType } from '@owlmeans/auth';
2
2
  import { plugins as authPlugins } from '@owlmeans/client-auth/manager';
3
3
  import { supervisorClientPlugin } from './auth/plugins/supervisor.js';
4
- const isDevelopment = (context) => context.cfg.debug?.all === true || context.cfg.debug?.supervisor === true;
5
4
  /**
6
- * Unified, explicit append for the PK-based supervisor login UI. Call it once on
7
- * the web client context. Development-only by default. It registers the
8
- * supervisor client plugin so the form is rendered by the standard typed
9
- * authentication route at {@link SUPERVISOR_LOGIN_PATH}.
5
+ * Whether this deployment wants the PK supervisor login.
6
+ *
7
+ * Reads `debug.supervisor` and deliberately NOT `debug.all`. `debug.all` is set by whole families
8
+ * of applications for reasons that have nothing to do with authentication — a generated target
9
+ * application sets it for itself — so gating on it hands an operator login to every one of them,
10
+ * in production, reachable by anyone who types the URL. `debug.supervisor` is a deployment saying
11
+ * this specific thing on purpose.
12
+ */
13
+ const isSupervised = (context) => context.cfg.debug?.supervisor === true;
14
+ /**
15
+ * Unified, explicit append for the PK-based supervisor login UI. Call it once on the web client
16
+ * context. It registers the supervisor client plugin so the form is rendered by the standard typed
17
+ * authentication route at {@link SUPERVISOR_LOGIN_PATH}, and enables it in the sign-in screen's
18
+ * configuration — which is what turns a `restricted` method from registered into offerable.
10
19
  */
11
20
  export const appendSupervisorAuth = (context, opts) => {
12
- const enabled = opts?.enabled ?? isDevelopment(context);
21
+ const enabled = opts?.enabled ?? isSupervised(context);
13
22
  if (!enabled) {
14
23
  return context;
15
24
  }
16
25
  authPlugins[AuthenticationType.Supervisor] = supervisorClientPlugin;
26
+ if (opts?.offer ?? true) {
27
+ const cfg = context.cfg;
28
+ cfg.security ??= {};
29
+ cfg.security.auth ??= {};
30
+ cfg.security.auth.login ??= {};
31
+ const login = cfg.security.auth.login;
32
+ login.secretKey ??= true;
33
+ login.overrides ??= {};
34
+ login.overrides[AuthenticationType.Supervisor] ??= { enabled: true };
35
+ }
17
36
  return context;
18
37
  };
19
38
  //# sourceMappingURL=append.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"append.js","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAOrE,MAAM,aAAa,GAAG,CAAC,OAAqE,EAAW,EAAE,CACvG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;AAE3E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAU,EAAE,IAA+B,EACxC,EAAE;IACL,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAA;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,sBAAsB,CAAA;IAEnE,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"append.js","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAmBrE;;;;;;;;GAQG;AACH,MAAM,YAAY,GAAG,CAAC,OAAqB,EAAW,EAAE,CACtD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;AAExC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAU,EAAE,IAA+B,EACxC,EAAE;IACL,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAA;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,sBAAsB,CAAA;IAEnE,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAmB,CAAA;QACvC,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAA;QACnB,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAA;QACxB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAA;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAA;QACrC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAA;QACxB,KAAK,CAAC,SAAS,KAAK,EAAE,CAAA;QACtB,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACtE,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/auth/plugins/supervisor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAWjF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,oBAsEpC,CAAA"}
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/auth/plugins/supervisor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAWjF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,oBA2EpC,CAAA"}
@@ -20,6 +20,10 @@ import { createIdOfLength } from '@owlmeans/basic-ids';
20
20
  */
21
21
  export const supervisorClientPlugin = {
22
22
  type: AuthenticationType.Supervisor,
23
+ // `restricted`, so registering the plugin is not enough to put an operator login on the sign-in
24
+ // screen of a production application — the configuration has to name it. Last in the order and
25
+ // rendered as a link, because it is a tool, not a way in.
26
+ method: { order: 900, icon: 'key', emphasis: 'link', restricted: true },
23
27
  Implementation: () => ({ type, control }) => {
24
28
  const context = useContext();
25
29
  const [userId, setUserId] = useState('');
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../src/auth/plugins/supervisor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../src/auth/plugins/supervisor.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/web-auth",
3
- "version": "0.1.18-rc.2",
3
+ "version": "0.1.18-rc.20",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -29,21 +29,22 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@owlmeans/auth": "^0.1.18-rc.2",
33
- "@owlmeans/auth-common": "^0.1.18-rc.2",
34
- "@owlmeans/basic-ids": "^0.1.18-rc.2",
35
- "@owlmeans/basic-keys": "^0.1.18-rc.2",
36
- "@owlmeans/client": "^0.1.18-rc.2",
37
- "@owlmeans/client-auth": "^0.1.18-rc.2",
38
- "@owlmeans/context": "^0.1.18-rc.2",
39
- "@owlmeans/web-client": "^0.1.18-rc.2"
32
+ "@owlmeans/auth": "^0.1.18-rc.7",
33
+ "@owlmeans/auth-common": "^0.1.18-rc.9",
34
+ "@owlmeans/basic-ids": "^0.1.18-rc.7",
35
+ "@owlmeans/basic-keys": "^0.1.18-rc.9",
36
+ "@owlmeans/client": "^0.1.18-rc.11",
37
+ "@owlmeans/client-auth": "^0.1.18-rc.13",
38
+ "@owlmeans/config": "^0.1.18-rc.8",
39
+ "@owlmeans/context": "^0.1.18-rc.6",
40
+ "@owlmeans/web-client": "^0.1.18-rc.18"
40
41
  },
41
42
  "peerDependencies": {
42
43
  "react": "*"
43
44
  },
44
45
  "devDependencies": {
45
46
  "@owlmeans/dep-config": "workspace:*",
46
- "@types/bun": "^1.3.14",
47
+ "@types/bun": "^1.4.0",
47
48
  "@types/react": "^19.2.17",
48
49
  "nodemon": "^3.1.14",
49
50
  "typescript": "^7.0.2"
package/src/append.ts CHANGED
@@ -1,30 +1,63 @@
1
1
  import { AuthenticationType } from '@owlmeans/auth'
2
2
  import { plugins as authPlugins } from '@owlmeans/client-auth/manager'
3
+ import type { CommonConfig } from '@owlmeans/config'
3
4
  import { supervisorClientPlugin } from './auth/plugins/supervisor.js'
4
5
 
5
6
  export interface WebSupervisorAuthOptions {
6
- /** Force enable/disable. Default: development only (cfg.debug.all || cfg.debug.supervisor). */
7
+ /** Force enable/disable. Default: `cfg.debug.supervisor === true`. */
7
8
  enabled?: boolean
9
+ /**
10
+ * Also offer it on the sign-in screen. Defaults to true — an operator login that is registered
11
+ * but reachable only by typing its URL is a login nobody finds and an exposure nobody sees.
12
+ */
13
+ offer?: boolean
8
14
  }
9
15
 
10
- const isDevelopment = (context: { cfg: { debug?: { all?: boolean, supervisor?: boolean } } }): boolean =>
11
- context.cfg.debug?.all === true || context.cfg.debug?.supervisor === true
16
+ interface DebugCarrier {
17
+ cfg: {
18
+ debug?: { all?: boolean, supervisor?: boolean }
19
+ security?: CommonConfig['security']
20
+ }
21
+ }
12
22
 
13
23
  /**
14
- * Unified, explicit append for the PK-based supervisor login UI. Call it once on
15
- * the web client context. Development-only by default. It registers the
16
- * supervisor client plugin so the form is rendered by the standard typed
17
- * authentication route at {@link SUPERVISOR_LOGIN_PATH}.
24
+ * Whether this deployment wants the PK supervisor login.
25
+ *
26
+ * Reads `debug.supervisor` and deliberately NOT `debug.all`. `debug.all` is set by whole families
27
+ * of applications for reasons that have nothing to do with authentication — a generated target
28
+ * application sets it for itself — so gating on it hands an operator login to every one of them,
29
+ * in production, reachable by anyone who types the URL. `debug.supervisor` is a deployment saying
30
+ * this specific thing on purpose.
18
31
  */
19
- export const appendSupervisorAuth = <T extends { cfg: { debug?: { all?: boolean, supervisor?: boolean } } }>(
32
+ const isSupervised = (context: DebugCarrier): boolean =>
33
+ context.cfg.debug?.supervisor === true
34
+
35
+ /**
36
+ * Unified, explicit append for the PK-based supervisor login UI. Call it once on the web client
37
+ * context. It registers the supervisor client plugin so the form is rendered by the standard typed
38
+ * authentication route at {@link SUPERVISOR_LOGIN_PATH}, and enables it in the sign-in screen's
39
+ * configuration — which is what turns a `restricted` method from registered into offerable.
40
+ */
41
+ export const appendSupervisorAuth = <T extends DebugCarrier>(
20
42
  context: T, opts?: WebSupervisorAuthOptions
21
43
  ): T => {
22
- const enabled = opts?.enabled ?? isDevelopment(context)
44
+ const enabled = opts?.enabled ?? isSupervised(context)
23
45
  if (!enabled) {
24
46
  return context
25
47
  }
26
48
 
27
49
  authPlugins[AuthenticationType.Supervisor] = supervisorClientPlugin
28
50
 
51
+ if (opts?.offer ?? true) {
52
+ const cfg = context.cfg as CommonConfig
53
+ cfg.security ??= {}
54
+ cfg.security.auth ??= {}
55
+ cfg.security.auth.login ??= {}
56
+ const login = cfg.security.auth.login
57
+ login.secretKey ??= true
58
+ login.overrides ??= {}
59
+ login.overrides[AuthenticationType.Supervisor] ??= { enabled: true }
60
+ }
61
+
29
62
  return context
30
63
  }
@@ -26,6 +26,11 @@ import { createIdOfLength } from '@owlmeans/basic-ids'
26
26
  export const supervisorClientPlugin: AuthenticationPlugin = {
27
27
  type: AuthenticationType.Supervisor,
28
28
 
29
+ // `restricted`, so registering the plugin is not enough to put an operator login on the sign-in
30
+ // screen of a production application — the configuration has to name it. Last in the order and
31
+ // rendered as a link, because it is a tool, not a way in.
32
+ method: { order: 900, icon: 'key', emphasis: 'link', restricted: true },
33
+
29
34
  Implementation: () => ({ type, control }) => {
30
35
  const context = useContext()
31
36
  const [userId, setUserId] = useState('')