@dudousxd/adonis-authkit-server 0.1.0 → 0.2.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 (38) hide show
  1. package/build/index.d.ts +3 -2
  2. package/build/index.js +2 -1
  3. package/build/src/accounts/account_store.d.ts +74 -17
  4. package/build/src/accounts/account_store.js +12 -1
  5. package/build/src/accounts/lucid_account_store.d.ts +12 -27
  6. package/build/src/accounts/lucid_account_store.js +38 -365
  7. package/build/src/accounts/lucid_store/core.d.ts +8 -0
  8. package/build/src/accounts/lucid_store/core.js +108 -0
  9. package/build/src/accounts/lucid_store/mfa.d.ts +8 -0
  10. package/build/src/accounts/lucid_store/mfa.js +77 -0
  11. package/build/src/accounts/lucid_store/provider_identity.d.ts +8 -0
  12. package/build/src/accounts/lucid_store/provider_identity.js +41 -0
  13. package/build/src/accounts/lucid_store/shared.d.ts +48 -0
  14. package/build/src/accounts/lucid_store/shared.js +15 -0
  15. package/build/src/accounts/lucid_store/webauthn.d.ts +8 -0
  16. package/build/src/accounts/lucid_store/webauthn.js +135 -0
  17. package/build/src/define_config.d.ts +6 -0
  18. package/build/src/define_config.js +20 -5
  19. package/build/src/host/controllers/account_mfa_controller.js +2 -1
  20. package/build/src/host/controllers/account_session_controller.js +10 -18
  21. package/build/src/host/controllers/interaction_controller.js +13 -32
  22. package/build/src/host/controllers/social_controller.js +7 -0
  23. package/build/src/host/login_attempt.d.ts +39 -0
  24. package/build/src/host/login_attempt.js +37 -0
  25. package/build/src/host/register_auth_host.d.ts +13 -0
  26. package/build/src/host/register_auth_host.js +9 -2
  27. package/build/src/mixins/json_column.d.ts +38 -0
  28. package/build/src/mixins/json_column.js +31 -0
  29. package/build/src/mixins/with_audit_log.js +2 -4
  30. package/build/src/mixins/with_auth_user.js +2 -4
  31. package/build/src/mixins/with_mfa.js +2 -6
  32. package/build/src/mixins/with_personal_access_token.js +2 -4
  33. package/build/src/mixins/with_webauthn_credential.js +6 -8
  34. package/build/stubs/config/authkit.stub +1 -1
  35. package/build/stubs/models/auth_user.stub +12 -3
  36. package/package.json +1 -1
  37. package/stubs/config/authkit.stub +1 -1
  38. package/stubs/models/auth_user.stub +12 -3
package/build/index.d.ts CHANGED
@@ -6,11 +6,12 @@ export { withMfa } from './src/mixins/with_mfa.js';
6
6
  export { OidcService } from './src/provider/oidc_service.js';
7
7
  export { registerOidcRoutes } from './src/register_routes.js';
8
8
  export type { AuthServerConfigInput, ResolvedServerConfig, DynamicRegistrationConfigInput, ResolvedDynamicRegistrationConfig, AdminConfigInput, ResolvedAdminConfig, } from './src/define_config.js';
9
- export { resolveAdmin, resolveWebauthn } from './src/define_config.js';
9
+ export { resolveAdmin, resolveWebauthn, resolveDynamicRegistration } from './src/define_config.js';
10
10
  export type { WebauthnConfigInput, ResolvedWebauthnConfig } from './src/define_config.js';
11
11
  export { lucidAccountStore } from './src/accounts/lucid_account_store.js';
12
12
  export type { LucidAccountStoreOptions, AccountSecretEncrypter, } from './src/accounts/lucid_account_store.js';
13
- export type { AccountStore, AuthAccount, CreateAccountInput, LinkProviderIdentityInput, ListAccountsParams, Paginated, PasskeySummary, } from './src/accounts/account_store.js';
13
+ export type { AccountStore, CoreAccountStore, AdminCapability, MfaCapability, WebauthnCapability, ProviderIdentityCapability, AuthAccount, CreateAccountInput, LinkProviderIdentityInput, ListAccountsParams, Paginated, PasskeySummary, } from './src/accounts/account_store.js';
14
+ export { supportsMfa, supportsPasskeys, supportsProviderIdentity, } from './src/accounts/account_store.js';
14
15
  export { withProviderIdentity } from './src/mixins/with_provider_identity.js';
15
16
  export type { ProviderIdentityRow, ProviderIdentityClass, } from './src/mixins/with_provider_identity.js';
16
17
  export { withWebauthnCredential } from './src/mixins/with_webauthn_credential.js';
package/build/index.js CHANGED
@@ -5,8 +5,9 @@ export { withCredentials } from './src/mixins/with_credentials.js';
5
5
  export { withMfa } from './src/mixins/with_mfa.js';
6
6
  export { OidcService } from './src/provider/oidc_service.js';
7
7
  export { registerOidcRoutes } from './src/register_routes.js';
8
- export { resolveAdmin, resolveWebauthn } from './src/define_config.js';
8
+ export { resolveAdmin, resolveWebauthn, resolveDynamicRegistration } from './src/define_config.js';
9
9
  export { lucidAccountStore } from './src/accounts/lucid_account_store.js';
10
+ export { supportsMfa, supportsPasskeys, supportsProviderIdentity, } from './src/accounts/account_store.js';
10
11
  export { withProviderIdentity } from './src/mixins/with_provider_identity.js';
11
12
  export { withWebauthnCredential } from './src/mixins/with_webauthn_credential.js';
12
13
  export { lucidPatStore } from './src/pat/lucid_pat_store.js';
@@ -47,15 +47,20 @@ export interface PasskeySummary {
47
47
  /** ISO timestamp de criação. */
48
48
  createdAt: string;
49
49
  }
50
- export interface AccountStore {
50
+ /**
51
+ * Núcleo SEMPRE presente do store de contas: identidade (findById/verifyCredentials),
52
+ * cadastro, reset de senha, verificação de e-mail e administração (listagem/roles).
53
+ *
54
+ * As demais funcionalidades (MFA, passkeys/WebAuthn, account linking por provider)
55
+ * são CAPACIDADES separadas e opcionais — um store pode implementá-las ou não. Veja
56
+ * {@link MfaCapability}, {@link WebauthnCapability}, {@link ProviderIdentityCapability}.
57
+ * O tipo composto usado pela config é {@link AccountStore}.
58
+ */
59
+ export interface CoreAccountStore extends AdminCapability {
51
60
  findById(id: string): Promise<AuthAccount | null>;
52
61
  verifyCredentials(email: string, password: string): Promise<AuthAccount | null>;
53
62
  findByEmail(email: string): Promise<AuthAccount | null>;
54
63
  create(input: CreateAccountInput): Promise<AuthAccount>;
55
- /** Acha a conta ligada a uma identidade de provider; null se desconhecida. */
56
- findByProviderIdentity(provider: string, providerUserId: string): Promise<AuthAccount | null>;
57
- /** Liga (upsert idempotente na chave única) uma identidade de provider a uma conta. */
58
- linkProviderIdentity(data: LinkProviderIdentityInput): Promise<void>;
59
64
  issuePasswordResetToken(email: string): Promise<{
60
65
  token: string;
61
66
  account: AuthAccount;
@@ -66,19 +71,45 @@ export interface AccountStore {
66
71
  account: AuthAccount;
67
72
  } | null>;
68
73
  consumeEmailVerificationToken(token: string): Promise<boolean>;
74
+ }
75
+ /**
76
+ * Administração (console admin opt-in — B6). Hoje faz parte do núcleo (os stores
77
+ * default sempre a implementam e os controllers admin a chamam direto), mas é
78
+ * modelada como capacidade própria para clareza e futura granularidade.
79
+ */
80
+ export interface AdminCapability {
69
81
  /** Lista contas paginadas, opcionalmente filtrando por e-mail. */
70
82
  listAccounts(params: ListAccountsParams): Promise<Paginated<AuthAccount>>;
71
83
  /** Substitui as roles globais de uma conta. */
72
84
  setGlobalRoles(accountId: string, roles: string[]): Promise<void>;
85
+ }
86
+ /**
87
+ * Account linking por identidade de provider (Google, GitHub, …).
88
+ * `(provider, providerUserId)` é a chave estável vinda do provider OAuth — não
89
+ * depende do e-mail (que pode mudar / não estar presente). Uma conta pode ter
90
+ * várias identidades. Stores sem suporte simplesmente NÃO expõem estes métodos
91
+ * (a capacidade fica ausente) — não há fallback que lança.
92
+ */
93
+ export interface ProviderIdentityCapability {
94
+ /** Acha a conta ligada a uma identidade de provider; null se desconhecida. */
95
+ findByProviderIdentity(provider: string, providerUserId: string): Promise<AuthAccount | null>;
96
+ /** Liga (upsert idempotente na chave única) uma identidade de provider a uma conta. */
97
+ linkProviderIdentity(data: LinkProviderIdentityInput): Promise<void>;
98
+ }
99
+ /**
100
+ * MFA / TOTP. Stores sem suporte a MFA omitem a capacidade inteira; o interaction
101
+ * flow trata a ausência como "MFA desligado".
102
+ */
103
+ export interface MfaCapability {
73
104
  /** Estado do MFA da conta (se o desafio TOTP deve ser exigido no login). */
74
- getMfaState?(accountId: string): Promise<{
105
+ getMfaState(accountId: string): Promise<{
75
106
  enabled: boolean;
76
107
  }>;
77
108
  /**
78
109
  * Inicia o enrollment TOTP: gera um segredo PENDENTE (mfaEnabledAt continua
79
110
  * null) e devolve o segredo + otpauth URI (keyuri). Não ativa o MFA ainda.
80
111
  */
81
- startTotpEnrollment?(accountId: string): Promise<{
112
+ startTotpEnrollment(accountId: string): Promise<{
82
113
  secret: string;
83
114
  otpauthUri: string;
84
115
  } | null>;
@@ -87,23 +118,33 @@ export interface AccountStore {
87
118
  * de sucesso ativa o MFA, gera N recovery codes e devolve os códigos em claro
88
119
  * (uma única vez).
89
120
  */
90
- confirmTotpEnrollment?(accountId: string, code: string): Promise<{
121
+ confirmTotpEnrollment(accountId: string, code: string): Promise<{
91
122
  ok: boolean;
92
123
  recoveryCodes?: string[];
93
124
  }>;
94
125
  /** Verifica um código TOTP contra o segredo ativo. */
95
- verifyTotp?(accountId: string, code: string): Promise<boolean>;
126
+ verifyTotp(accountId: string, code: string): Promise<boolean>;
96
127
  /** Consome (single-use) um recovery code; true se casou e foi removido. */
97
- consumeRecoveryCode?(accountId: string, code: string): Promise<boolean>;
128
+ consumeRecoveryCode(accountId: string, code: string): Promise<boolean>;
98
129
  /** Desliga o MFA: limpa segredo + mfaEnabledAt + recovery codes. */
99
- disableMfa?(accountId: string): Promise<void>;
130
+ disableMfa(accountId: string): Promise<void>;
131
+ }
132
+ /**
133
+ * MFA / WebAuthn (passkeys) — 2º fator alternativo ao TOTP. Como o TOTP, é uma
134
+ * capacidade INTEIRA opcional: stores sem suporte a passkeys não a expõem e a UI
135
+ * esconde a seção de passkeys. O `expectedChallenge` é gerado no begin
136
+ * (generate*Options) e DEVE ser guardado pelo controller (na sessão) para ser
137
+ * passado de volta no finish (verify*) — o store não mantém estado de desafio
138
+ * entre as chamadas.
139
+ */
140
+ export interface WebauthnCapability {
100
141
  /**
101
142
  * Inicia o registro de uma passkey: gera as opções de criação
102
143
  * (`generateRegistrationOptions`) escopadas à conta (e excluindo credenciais já
103
144
  * registradas). Devolve as opções JSON (o controller serializa pro browser) e o
104
145
  * `challenge` (base64url) para guardar na sessão. null = conta inexistente.
105
146
  */
106
- generatePasskeyRegistrationOptions?(accountId: string): Promise<{
147
+ generatePasskeyRegistrationOptions(accountId: string): Promise<{
107
148
  options: Record<string, unknown>;
108
149
  challenge: string;
109
150
  } | null>;
@@ -113,13 +154,13 @@ export interface AccountStore {
113
154
  * de sucesso persiste a credencial (id, publicKey, counter, transports) e
114
155
  * habilita o MFA. Retorna true se registrou.
115
156
  */
116
- verifyPasskeyRegistration?(accountId: string, response: unknown, expectedChallenge: string): Promise<boolean>;
157
+ verifyPasskeyRegistration(accountId: string, response: unknown, expectedChallenge: string): Promise<boolean>;
117
158
  /**
118
159
  * Inicia a autenticação por passkey no login: gera as opções
119
160
  * (`generateAuthenticationOptions`) restritas às credenciais da conta. Devolve
120
161
  * as opções JSON + o `challenge` para guardar na sessão. null = conta sem passkeys.
121
162
  */
122
- generatePasskeyAuthenticationOptions?(accountId: string): Promise<{
163
+ generatePasskeyAuthenticationOptions(accountId: string): Promise<{
123
164
  options: Record<string, unknown>;
124
165
  challenge: string;
125
166
  } | null>;
@@ -128,9 +169,25 @@ export interface AccountStore {
128
169
  * (`verifyAuthenticationResponse`) contra o `expectedChallenge` guardado. Em
129
170
  * caso de sucesso atualiza o signature counter armazenado. Retorna true se válido.
130
171
  */
131
- verifyPasskeyAuthentication?(accountId: string, response: unknown, expectedChallenge: string): Promise<boolean>;
172
+ verifyPasskeyAuthentication(accountId: string, response: unknown, expectedChallenge: string): Promise<boolean>;
132
173
  /** Lista as passkeys da conta (sem expor chave pública / counter). */
133
- listPasskeys?(accountId: string): Promise<PasskeySummary[]>;
174
+ listPasskeys(accountId: string): Promise<PasskeySummary[]>;
134
175
  /** Remove uma passkey (por credential id) da conta. */
135
- removePasskey?(accountId: string, credentialId: string): Promise<void>;
176
+ removePasskey(accountId: string, credentialId: string): Promise<void>;
136
177
  }
178
+ /**
179
+ * Store de contas usado pela config. É o núcleo SEMPRE presente
180
+ * ({@link CoreAccountStore}) + as capacidades opcionais (MFA, WebAuthn, account
181
+ * linking por provider) marcadas como `Partial` — assim configs/hosts existentes
182
+ * (que referenciam `AccountStore`) compilam sem mudança, e stores que NÃO
183
+ * implementam uma capacidade simplesmente omitem os métodos (em vez de tê-los
184
+ * presentes-mas-lançando). Use os type guards {@link supportsMfa},
185
+ * {@link supportsPasskeys}, {@link supportsProviderIdentity} para estreitar.
186
+ */
187
+ export type AccountStore = CoreAccountStore & Partial<MfaCapability & WebauthnCapability & ProviderIdentityCapability>;
188
+ /** Type guard: o store implementa a capacidade de MFA / TOTP. */
189
+ export declare function supportsMfa(store: AccountStore): store is AccountStore & MfaCapability;
190
+ /** Type guard: o store implementa a capacidade de passkeys / WebAuthn. */
191
+ export declare function supportsPasskeys(store: AccountStore): store is AccountStore & WebauthnCapability;
192
+ /** Type guard: o store implementa account linking por identidade de provider. */
193
+ export declare function supportsProviderIdentity(store: AccountStore): store is AccountStore & ProviderIdentityCapability;
@@ -1 +1,12 @@
1
- export {};
1
+ /** Type guard: o store implementa a capacidade de MFA / TOTP. */
2
+ export function supportsMfa(store) {
3
+ return typeof store.getMfaState === 'function';
4
+ }
5
+ /** Type guard: o store implementa a capacidade de passkeys / WebAuthn. */
6
+ export function supportsPasskeys(store) {
7
+ return typeof store.listPasskeys === 'function';
8
+ }
9
+ /** Type guard: o store implementa account linking por identidade de provider. */
10
+ export function supportsProviderIdentity(store) {
11
+ return typeof store.findByProviderIdentity === 'function';
12
+ }
@@ -1,15 +1,6 @@
1
- import { generateAuthenticationOptions, generateRegistrationOptions, verifyAuthenticationResponse, verifyRegistrationResponse } from '@simplewebauthn/server';
2
1
  import type { AccountStore } from './account_store.js';
3
- /**
4
- * Encripta/decripta um valor (ex.: o segredo TOTP) em repouso. Mantém a lib
5
- * desacoplada do serviço de encryption do app — qualquer implementação que
6
- * faça round-trip serve (em prod, normalmente o `@adonisjs/core/services/encryption`).
7
- * `decrypt` retorna `null` se o valor foi adulterado/é inválido.
8
- */
9
- export interface AccountSecretEncrypter {
10
- encrypt(value: string): string;
11
- decrypt(value: string): string | null;
12
- }
2
+ import { type AccountSecretEncrypter, type WebauthnCeremonies } from './lucid_store/shared.js';
3
+ export type { AccountSecretEncrypter, WebauthnCeremonies };
13
4
  /** Opções do {@link lucidAccountStore}. */
14
5
  export interface LucidAccountStoreOptions {
15
6
  /** Label de issuer mostrado no app autenticador (keyuri). Default: 'AuthKit'. */
@@ -24,15 +15,15 @@ export interface LucidAccountStoreOptions {
24
15
  /**
25
16
  * Model Lucid das identidades de provider (composto de `withProviderIdentity()`),
26
17
  * usado por `findByProviderIdentity`/`linkProviderIdentity` (account linking
27
- * social). Ausente → esses dois métodos lançam (hosts email-only continuam
28
- * funcionando até optarem por habilitar).
18
+ * social). Ausente → a capacidade de account linking fica AUSENTE do store (os
19
+ * métodos não existem; hosts email-only continuam funcionando).
29
20
  */
30
21
  providerIdentityModel?: any;
31
22
  /**
32
23
  * Model Lucid das credenciais WebAuthn / passkeys (composto de
33
- * `withWebauthnCredential()`), usado pelos métodos `*Passkey*`. Ausente → esses
34
- * métodos viram `undefined` na interface (hosts sem passkeys não mudam de
35
- * comportamento; a UI esconde a seção de passkeys).
24
+ * `withWebauthnCredential()`), usado pelos métodos `*Passkey*`. Ausente → a
25
+ * capacidade de passkeys fica AUSENTE do store (os métodos não existem; a UI
26
+ * esconde a seção de passkeys).
36
27
  */
37
28
  webauthnCredentialModel?: any;
38
29
  /**
@@ -55,21 +46,15 @@ export interface LucidAccountStoreOptions {
55
46
  */
56
47
  webauthnCeremonies?: Partial<WebauthnCeremonies>;
57
48
  }
58
- /**
59
- * Funções das cerimônias WebAuthn. Espelham a assinatura do `@simplewebauthn/server`
60
- * (subconjunto usado). Injetáveis via {@link LucidAccountStoreOptions.webauthnCeremonies}
61
- * para testes.
62
- */
63
- export interface WebauthnCeremonies {
64
- generateRegistrationOptions: typeof generateRegistrationOptions;
65
- verifyRegistrationResponse: typeof verifyRegistrationResponse;
66
- generateAuthenticationOptions: typeof generateAuthenticationOptions;
67
- verifyAuthenticationResponse: typeof verifyAuthenticationResponse;
68
- }
69
49
  /**
70
50
  * Implementação default do {@link AccountStore} sobre um model Lucid composto
71
51
  * de `withAuthUser()` + `withCredentials()` (+ opcionalmente `withMfa()`). O
72
52
  * model carrega `connection`/`table` (app-específico) e, por convenção, uma
73
53
  * coluna `fullName` (mapeada de `name`).
54
+ *
55
+ * Composição por CAPACIDADE: o núcleo + MFA são sempre montados; passkeys
56
+ * (WebAuthn) e account linking por provider só são montados quando o model
57
+ * correspondente é fornecido — caso contrário a capacidade fica ABSENTE (os
58
+ * métodos não existem no objeto retornado, em vez de presentes-mas-lançando).
74
59
  */
75
60
  export declare function lucidAccountStore(Model: any, options?: LucidAccountStoreOptions): AccountStore;