@dudousxd/adonis-authkit-server 0.1.1 → 0.3.0

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 (50) hide show
  1. package/build/host/views/admin/client_form.edge +83 -0
  2. package/build/host/views/admin/clients.edge +68 -3
  3. package/build/index.d.ts +3 -2
  4. package/build/index.js +2 -1
  5. package/build/src/accounts/account_store.d.ts +74 -17
  6. package/build/src/accounts/account_store.js +12 -1
  7. package/build/src/accounts/lucid_account_store.d.ts +12 -27
  8. package/build/src/accounts/lucid_account_store.js +38 -365
  9. package/build/src/accounts/lucid_store/core.d.ts +8 -0
  10. package/build/src/accounts/lucid_store/core.js +108 -0
  11. package/build/src/accounts/lucid_store/mfa.d.ts +8 -0
  12. package/build/src/accounts/lucid_store/mfa.js +77 -0
  13. package/build/src/accounts/lucid_store/provider_identity.d.ts +8 -0
  14. package/build/src/accounts/lucid_store/provider_identity.js +41 -0
  15. package/build/src/accounts/lucid_store/shared.d.ts +48 -0
  16. package/build/src/accounts/lucid_store/shared.js +15 -0
  17. package/build/src/accounts/lucid_store/webauthn.d.ts +8 -0
  18. package/build/src/accounts/lucid_store/webauthn.js +135 -0
  19. package/build/src/adapters/adapter_contract.d.ts +12 -0
  20. package/build/src/adapters/database_adapter.d.ts +8 -1
  21. package/build/src/adapters/database_adapter.js +17 -0
  22. package/build/src/adapters/redis_adapter.d.ts +8 -1
  23. package/build/src/adapters/redis_adapter.js +26 -0
  24. package/build/src/audit/audit_sink.d.ts +1 -1
  25. package/build/src/define_config.d.ts +6 -0
  26. package/build/src/define_config.js +20 -5
  27. package/build/src/host/admin_clients_service.d.ts +65 -0
  28. package/build/src/host/admin_clients_service.js +136 -0
  29. package/build/src/host/controllers/account_mfa_controller.js +2 -1
  30. package/build/src/host/controllers/account_session_controller.js +10 -18
  31. package/build/src/host/controllers/admin/admin_clients_controller.d.ts +17 -3
  32. package/build/src/host/controllers/admin/admin_clients_controller.js +158 -4
  33. package/build/src/host/controllers/interaction_controller.js +13 -32
  34. package/build/src/host/controllers/social_controller.js +7 -0
  35. package/build/src/host/i18n.d.ts +27 -0
  36. package/build/src/host/i18n.js +28 -1
  37. package/build/src/host/login_attempt.d.ts +39 -0
  38. package/build/src/host/login_attempt.js +37 -0
  39. package/build/src/host/register_auth_host.d.ts +13 -0
  40. package/build/src/host/register_auth_host.js +17 -2
  41. package/build/src/mixins/json_column.d.ts +38 -0
  42. package/build/src/mixins/json_column.js +31 -0
  43. package/build/src/mixins/with_audit_log.js +2 -4
  44. package/build/src/mixins/with_auth_user.js +2 -4
  45. package/build/src/mixins/with_mfa.js +2 -6
  46. package/build/src/mixins/with_personal_access_token.js +2 -4
  47. package/build/src/mixins/with_webauthn_credential.js +6 -8
  48. package/build/src/provider/oidc_service.d.ts +15 -0
  49. package/build/src/provider/oidc_service.js +27 -0
  50. package/package.json +1 -1
@@ -5,6 +5,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { column } from '@adonisjs/lucid/orm';
8
+ import { jsonColumn } from './json_column.js';
8
9
  /**
9
10
  * Mixin de MFA/TOTP. Adiciona as colunas `totp_secret`, `mfa_enabled_at` e
10
11
  * `recovery_codes` ao model de credenciais. Mantido separado de
@@ -26,12 +27,7 @@ export function withMfa() {
26
27
  __decorate([
27
28
  column({
28
29
  serializeAs: null,
29
- prepare: (value) => (value ? JSON.stringify(value) : null),
30
- consume: (value) => {
31
- if (value === null || value === undefined)
32
- return null;
33
- return Array.isArray(value) ? value : JSON.parse(value);
34
- },
30
+ ...jsonColumn({ fallback: null, passthroughParsed: true }),
35
31
  })
36
32
  ], MfaMixin.prototype, "recoveryCodes", void 0);
37
33
  return MfaMixin;
@@ -5,6 +5,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { column } from '@adonisjs/lucid/orm';
8
+ import { jsonColumn } from './json_column.js';
8
9
  export function withPersonalAccessToken() {
9
10
  return (superclass) => {
10
11
  class PatMixin extends superclass {
@@ -19,10 +20,7 @@ export function withPersonalAccessToken() {
19
20
  column({ serializeAs: null })
20
21
  ], PatMixin.prototype, "tokenHash", void 0);
21
22
  __decorate([
22
- column({
23
- prepare: (value) => (value ? JSON.stringify(value) : null),
24
- consume: (value) => (value ? JSON.parse(value) : []),
25
- })
23
+ column(jsonColumn({ fallback: [] }))
26
24
  ], PatMixin.prototype, "scopes", void 0);
27
25
  __decorate([
28
26
  column()
@@ -5,6 +5,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { column } from '@adonisjs/lucid/orm';
8
+ import { jsonColumn } from './json_column.js';
8
9
  /**
9
10
  * Mixin de credenciais WebAuthn / passkey. Adiciona as colunas
10
11
  * `account_id`, `public_key`, `counter`, `transports`, `label` + timestamps ao
@@ -26,14 +27,11 @@ export function withWebauthnCredential() {
26
27
  column()
27
28
  ], WebauthnCredentialMixin.prototype, "counter", void 0);
28
29
  __decorate([
29
- column({
30
- prepare: (value) => (value && value.length ? JSON.stringify(value) : null),
31
- consume: (value) => {
32
- if (value === null || value === undefined)
33
- return null;
34
- return Array.isArray(value) ? value : JSON.parse(value);
35
- },
36
- })
30
+ column(jsonColumn({
31
+ fallback: null,
32
+ treatEmptyArrayAsEmpty: true,
33
+ passthroughParsed: true,
34
+ }))
37
35
  ], WebauthnCredentialMixin.prototype, "transports", void 0);
38
36
  __decorate([
39
37
  column()
@@ -12,6 +12,21 @@ export declare class OidcService {
12
12
  readonly interactions: InteractionActions;
13
13
  get config(): ResolvedServerConfig;
14
14
  constructor(config: ResolvedServerConfig, appKey: string, recorder?: MetricsRecorder);
15
+ /**
16
+ * Invalida o cache de clients DINÂMICOS do oidc-provider (a `dynamicClients`
17
+ * QuickLRU em `instance(provider)`). DEVE ser chamado após qualquer escrita
18
+ * (create/update/delete) no model `Client` via adapter, pelo console admin.
19
+ *
20
+ * NOTA sobre o porquê: o oidc-provider v9 cacheia clients carregados do adapter
21
+ * numa LRU CUJA CHAVE É O HASH (sha256) DO PAYLOAD persistido — não o client_id.
22
+ * Por isso uma alteração de metadata já é "auto-invalidante": `Client.find` relê o
23
+ * adapter, hasheia o payload NOVO, dá cache-miss e reconstrói o client. Mesmo assim
24
+ * limpamos a LRU explicitamente para (a) tornar o efeito imediato e determinístico
25
+ * (sem depender de pressão de LRU para expulsar a entrada antiga, agora inalcançável)
26
+ * e (b) liberar a entrada órfã na hora. É o caminho de invalidação suportado: a LRU
27
+ * é um detalhe interno acessível via o helper `weak_cache` do próprio provider.
28
+ */
29
+ evictDynamicClientCache(): Promise<void>;
15
30
  /** Verifica client_id + client_secret contra os clients da config (p/ endpoints custom como introspecção de PAT). */
16
31
  verifyClientCredentials(clientId: string, clientSecret: string): boolean;
17
32
  }
@@ -72,6 +72,33 @@ export class OidcService {
72
72
  }
73
73
  this.interactions = createInteractionActions(this.provider, { verifyCredentials: config.verifyCredentials });
74
74
  }
75
+ /**
76
+ * Invalida o cache de clients DINÂMICOS do oidc-provider (a `dynamicClients`
77
+ * QuickLRU em `instance(provider)`). DEVE ser chamado após qualquer escrita
78
+ * (create/update/delete) no model `Client` via adapter, pelo console admin.
79
+ *
80
+ * NOTA sobre o porquê: o oidc-provider v9 cacheia clients carregados do adapter
81
+ * numa LRU CUJA CHAVE É O HASH (sha256) DO PAYLOAD persistido — não o client_id.
82
+ * Por isso uma alteração de metadata já é "auto-invalidante": `Client.find` relê o
83
+ * adapter, hasheia o payload NOVO, dá cache-miss e reconstrói o client. Mesmo assim
84
+ * limpamos a LRU explicitamente para (a) tornar o efeito imediato e determinístico
85
+ * (sem depender de pressão de LRU para expulsar a entrada antiga, agora inalcançável)
86
+ * e (b) liberar a entrada órfã na hora. É o caminho de invalidação suportado: a LRU
87
+ * é um detalhe interno acessível via o helper `weak_cache` do próprio provider.
88
+ */
89
+ async evictDynamicClientCache() {
90
+ try {
91
+ const wc = await import('oidc-provider/lib/helpers/weak_cache.js');
92
+ const get = wc.default ?? wc.get;
93
+ const int = get(this.provider);
94
+ int?.dynamicClients?.clear?.();
95
+ }
96
+ catch {
97
+ // Estrutura interna mudou numa versão futura do oidc-provider: a invalidação por
98
+ // hash-de-conteúdo (acima) continua garantindo correção; só perdemos a expulsão
99
+ // imediata da entrada órfã. Best-effort — não propaga erro pro caminho da request.
100
+ }
101
+ }
75
102
  /** Verifica client_id + client_secret contra os clients da config (p/ endpoints custom como introspecção de PAT). */
76
103
  verifyClientCredentials(clientId, clientSecret) {
77
104
  const client = this.#clients.find((c) => c.clientId === clientId);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudousxd/adonis-authkit-server",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "AdonisJS OIDC/OAuth2 provider (Identity Provider) toolkit: ejectable auth server with sessions, rate-limiting, MFA/TOTP, audit log, federated logout and OpenTelemetry metrics.",
5
5
  "license": "MIT",
6
6
  "author": "dudousxd",