@dudousxd/adonis-authkit-server 0.1.1 → 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.
- package/build/index.d.ts +3 -2
- package/build/index.js +2 -1
- package/build/src/accounts/account_store.d.ts +74 -17
- package/build/src/accounts/account_store.js +12 -1
- package/build/src/accounts/lucid_account_store.d.ts +12 -27
- package/build/src/accounts/lucid_account_store.js +38 -365
- package/build/src/accounts/lucid_store/core.d.ts +8 -0
- package/build/src/accounts/lucid_store/core.js +108 -0
- package/build/src/accounts/lucid_store/mfa.d.ts +8 -0
- package/build/src/accounts/lucid_store/mfa.js +77 -0
- package/build/src/accounts/lucid_store/provider_identity.d.ts +8 -0
- package/build/src/accounts/lucid_store/provider_identity.js +41 -0
- package/build/src/accounts/lucid_store/shared.d.ts +48 -0
- package/build/src/accounts/lucid_store/shared.js +15 -0
- package/build/src/accounts/lucid_store/webauthn.d.ts +8 -0
- package/build/src/accounts/lucid_store/webauthn.js +135 -0
- package/build/src/define_config.d.ts +6 -0
- package/build/src/define_config.js +20 -5
- package/build/src/host/controllers/account_mfa_controller.js +2 -1
- package/build/src/host/controllers/account_session_controller.js +10 -18
- package/build/src/host/controllers/interaction_controller.js +13 -32
- package/build/src/host/controllers/social_controller.js +7 -0
- package/build/src/host/login_attempt.d.ts +39 -0
- package/build/src/host/login_attempt.js +37 -0
- package/build/src/host/register_auth_host.d.ts +13 -0
- package/build/src/host/register_auth_host.js +9 -2
- package/build/src/mixins/json_column.d.ts +38 -0
- package/build/src/mixins/json_column.js +31 -0
- package/build/src/mixins/with_audit_log.js +2 -4
- package/build/src/mixins/with_auth_user.js +2 -4
- package/build/src/mixins/with_mfa.js +2 -6
- package/build/src/mixins/with_personal_access_token.js +2 -4
- package/build/src/mixins/with_webauthn_credential.js +6 -8
- package/package.json +1 -1
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
126
|
+
verifyTotp(accountId: string, code: string): Promise<boolean>;
|
|
96
127
|
/** Consome (single-use) um recovery code; true se casou e foi removido. */
|
|
97
|
-
consumeRecoveryCode
|
|
128
|
+
consumeRecoveryCode(accountId: string, code: string): Promise<boolean>;
|
|
98
129
|
/** Desliga o MFA: limpa segredo + mfaEnabledAt + recovery codes. */
|
|
99
|
-
disableMfa
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
174
|
+
listPasskeys(accountId: string): Promise<PasskeySummary[]>;
|
|
134
175
|
/** Remove uma passkey (por credential id) da conta. */
|
|
135
|
-
removePasskey
|
|
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
|
-
|
|
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
|
-
|
|
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 →
|
|
28
|
-
*
|
|
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 →
|
|
34
|
-
*
|
|
35
|
-
*
|
|
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;
|