@adonis-agora/authkit-server 0.46.0 → 0.48.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/commands/clients_create.js +4 -4
- package/build/commands/configure.js +3 -2
- package/build/commands/doctor.js +8 -5
- package/build/commands/eject.js +1 -1
- package/build/commands/expire_scan.js +7 -5
- package/build/commands/import_users.js +1 -1
- package/build/commands/keys_rotate.js +7 -4
- package/build/host/views/account/apps.edge +5 -5
- package/build/host/views/account/login.edge +1 -1
- package/build/host/views/account/mfa.edge +7 -7
- package/build/host/views/account/orgs.edge +5 -5
- package/build/host/views/account/security.edge +10 -10
- package/build/host/views/account/tokens.edge +5 -5
- package/build/host/views/otp-unlock.edge +2 -2
- package/build/index.d.ts +7 -7
- package/build/index.js +5 -5
- package/build/providers/authkit_server_provider.d.ts +2 -2
- package/build/providers/authkit_server_provider.js +26 -10
- package/build/services/booted_app.d.ts +8 -0
- package/build/services/booted_app.js +27 -0
- package/build/services/main.d.ts +8 -1
- package/build/services/main.js +10 -2
- package/build/src/accounts/lucid_account_store.d.ts +3 -3
- package/build/src/accounts/lucid_account_store.js +6 -8
- package/build/src/accounts/lucid_store/core.js +1 -1
- package/build/src/accounts/lucid_store/mfa.js +1 -1
- package/build/src/accounts/lucid_store/organizations.js +2 -4
- package/build/src/accounts/lucid_store/password_hygiene.js +1 -4
- package/build/src/accounts/lucid_store/shared.d.ts +1 -1
- package/build/src/accounts/lucid_stores.d.ts +3 -3
- package/build/src/accounts/lucid_stores.js +2 -2
- package/build/src/adapters/database_adapter.js +3 -1
- package/build/src/adapters/factory.js +1 -1
- package/build/src/adapters/redis_adapter.js +2 -1
- package/build/src/commands/expire_scan_command.js +19 -5
- package/build/src/commands/settings_commands.js +22 -5
- package/build/src/define_config.d.ts +20 -20
- package/build/src/define_config.js +62 -67
- package/build/src/doctor/checks.js +45 -20
- package/build/src/events/dispatcher.d.ts +1 -1
- package/build/src/events/dispatcher.js +10 -10
- package/build/src/host/account_api/account_api_controller.js +95 -39
- package/build/src/host/account_deletion_ops.d.ts +4 -4
- package/build/src/host/account_deletion_ops.js +5 -5
- package/build/src/host/account_deletion_service.d.ts +2 -2
- package/build/src/host/account_deletion_service.js +2 -2
- package/build/src/host/account_export_service.d.ts +1 -1
- package/build/src/host/account_export_service.js +4 -6
- package/build/src/host/account_home.d.ts +0 -8
- package/build/src/host/account_home.js +6 -4
- package/build/src/host/account_login_url.d.ts +44 -0
- package/build/src/host/account_login_url.js +58 -0
- package/build/src/host/account_paths.d.ts +120 -0
- package/build/src/host/account_paths.js +161 -0
- package/build/src/host/admin_api/admin_orgs_service.d.ts +2 -2
- package/build/src/host/admin_api/admin_orgs_service.js +3 -2
- package/build/src/host/admin_api/admin_users_service.d.ts +12 -12
- package/build/src/host/admin_api/admin_users_service.js +20 -20
- package/build/src/host/admin_api/api_clients_controller.js +2 -2
- package/build/src/host/admin_api/api_misc_controller.js +2 -2
- package/build/src/host/admin_api/api_orgs_controller.js +3 -3
- package/build/src/host/admin_api/api_settings_controller.js +11 -5
- package/build/src/host/admin_api/api_users_controller.d.ts +2 -2
- package/build/src/host/admin_api/api_users_controller.js +37 -38
- package/build/src/host/admin_api/dto.d.ts +4 -4
- package/build/src/host/admin_clients_service.js +5 -4
- package/build/src/host/admin_console/admin_shell_controller.js +4 -2
- package/build/src/host/admin_console/console_audit_controller.js +1 -1
- package/build/src/host/admin_console/console_clients_controller.js +5 -3
- package/build/src/host/admin_console/console_impersonation_controller.js +1 -1
- package/build/src/host/admin_console/console_keys_controller.js +2 -4
- package/build/src/host/admin_console/console_orgs_controller.js +3 -3
- package/build/src/host/admin_console/console_roles_controller.js +30 -12
- package/build/src/host/admin_console/console_sessions_controller.js +3 -3
- package/build/src/host/admin_console/console_settings_controller.js +11 -5
- package/build/src/host/admin_console/console_users_controller.d.ts +2 -2
- package/build/src/host/admin_console/console_users_controller.js +46 -47
- package/build/src/host/admin_prefix.js +2 -2
- package/build/src/host/admin_sessions_service.d.ts +3 -1
- package/build/src/host/admin_sessions_service.js +36 -6
- package/build/src/host/adonis_auth_sync.d.ts +1 -1
- package/build/src/host/adonis_auth_user_provider.d.ts +1 -1
- package/build/src/host/app_key.js +1 -1
- package/build/src/host/avatar_storage.js +1 -3
- package/build/src/host/config_locks.js +1 -3
- package/build/src/host/console_session.d.ts +4 -0
- package/build/src/host/console_session.js +9 -2
- package/build/src/host/controllers/account_apps_controller.js +3 -2
- package/build/src/host/controllers/account_confirm_controller.js +2 -6
- package/build/src/host/controllers/account_mfa_controller.js +63 -12
- package/build/src/host/controllers/account_orgs_controller.js +53 -30
- package/build/src/host/controllers/account_security_controller.d.ts +2 -2
- package/build/src/host/controllers/account_security_controller.js +116 -116
- package/build/src/host/controllers/account_session_controller.js +7 -5
- package/build/src/host/controllers/account_tokens_controller.js +14 -2
- package/build/src/host/controllers/interaction_controller.js +59 -22
- package/build/src/host/controllers/pat_introspection_controller.js +10 -0
- package/build/src/host/controllers/registration_controller.js +28 -13
- package/build/src/host/default_mailer.js +11 -7
- package/build/src/host/durable/account_deletion_workflow.d.ts +2 -2
- package/build/src/host/durable/account_deletion_workflow.js +14 -14
- package/build/src/host/durable/account_export_workflow.d.ts +2 -2
- package/build/src/host/durable/account_export_workflow.js +12 -12
- package/build/src/host/durable/index.d.ts +5 -5
- package/build/src/host/durable/index.js +6 -6
- package/build/src/host/i18n.d.ts +1376 -1376
- package/build/src/host/i18n.js +1380 -1380
- package/build/src/host/impersonation.js +1 -7
- package/build/src/host/key_rotation_actions.d.ts +1 -1
- package/build/src/host/login_attempt.js +35 -6
- package/build/src/host/login_notify.js +1 -1
- package/build/src/host/middleware/account_auth.js +3 -1
- package/build/src/host/otp_lockout.js +1 -3
- package/build/src/host/rate_limit.js +1 -1
- package/build/src/host/register_auth_host.d.ts +96 -2
- package/build/src/host/register_auth_host.js +196 -91
- package/build/src/host/renderers/edge_renderer.js +19 -1
- package/build/src/host/renderers/inertia_renderer.d.ts +63 -0
- package/build/src/host/renderers/inertia_renderer.js +63 -0
- package/build/src/host/runtime_settings.js +1 -1
- package/build/src/host/runtime_toggles.d.ts +3 -3
- package/build/src/host/runtime_toggles.js +69 -24
- package/build/src/host/security_notice_service.d.ts +1 -1
- package/build/src/host/security_notice_service.js +1 -1
- package/build/src/host/session_context.js +1 -1
- package/build/src/host/sudo/index.d.ts +3 -3
- package/build/src/host/sudo/index.js +3 -3
- package/build/src/host/sudo/methods/magic_link.js +6 -5
- package/build/src/host/sudo/methods/passkey.js +7 -4
- package/build/src/host/sudo/methods/password.js +8 -3
- package/build/src/host/sudo/runtime.js +6 -13
- package/build/src/host/sudo_mode.js +3 -2
- package/build/src/host/ui-dist/assets/index-BQoTDiLV.js +137 -0
- package/build/src/host/ui-dist/index.html +1 -1
- package/build/src/keys/jwks_manager.js +1 -1
- package/build/src/keys/keystore.js +1 -1
- package/build/src/keys/keystore_manager.d.ts +2 -2
- package/build/src/keys/keystore_manager.js +2 -2
- package/build/src/keys/keystore_vault.js +8 -4
- package/build/src/mixins/with_audit_log.d.ts +1 -1
- package/build/src/mixins/with_auth_user.d.ts +1 -1
- package/build/src/mixins/with_auth_user.js +1 -1
- package/build/src/mixins/with_credentials.d.ts +1 -1
- package/build/src/mixins/with_mfa.d.ts +1 -1
- package/build/src/mixins/with_personal_access_token.d.ts +1 -1
- package/build/src/mixins/with_provider_identity.d.ts +1 -1
- package/build/src/mixins/with_webauthn_credential.d.ts +1 -1
- package/build/src/observability/diagnostics_bridge.js +2 -2
- package/build/src/observability/metrics_service.js +1 -1
- package/build/src/observability/telescope/data_providers.d.ts +1 -1
- package/build/src/observability/telescope/data_providers.js +29 -43
- package/build/src/observability/telescope/extension.d.ts +1 -1
- package/build/src/observability/telescope/extension.js +58 -58
- package/build/src/observability/telescope/index.d.ts +2 -2
- package/build/src/observability/telescope/index.js +2 -2
- package/build/src/observability/wire_provider_events.d.ts +1 -1
- package/build/src/observability/wire_provider_events.js +11 -11
- package/build/src/password/common_passwords.js +1 -1
- package/build/src/password/password_manager.d.ts +1 -1
- package/build/src/password/password_manager.js +4 -4
- package/build/src/pat/lucid_pat_store.js +2 -6
- package/build/src/pat/pat_tokens.js +1 -1
- package/build/src/provider/interaction_actions.js +1 -1
- package/build/src/provider/key_rotation_scheduler.js +3 -1
- package/build/src/provider/logout_sources.js +2 -8
- package/build/src/provider/oidc_service.d.ts +2 -2
- package/build/src/provider/oidc_service.js +22 -14
- package/build/src/provider/single_flight_lock.js +1 -3
- package/build/src/provider/token_exchange.d.ts +1 -1
- package/build/src/schema/ensure.js +3 -1
- package/build/stubs/ui/react/components/auth_shell.tsx +19 -19
- package/build/stubs/ui/react/pages/account/login.tsx +6 -7
- package/build/stubs/ui/react/pages/account/mfa.tsx +16 -15
- package/build/stubs/ui/react/pages/account/tokens.tsx +27 -17
- package/build/stubs/ui/react/pages/consent.tsx +12 -12
- package/build/stubs/ui/react/pages/forgot.tsx +7 -7
- package/build/stubs/ui/react/pages/login.tsx +22 -24
- package/build/stubs/ui/react/pages/mfa-challenge.tsx +9 -10
- package/build/stubs/ui/react/pages/reset.tsx +10 -10
- package/build/stubs/ui/react/pages/signup.tsx +30 -16
- package/build/stubs/ui/react/pages/verify-email.tsx +6 -6
- package/package.json +1 -1
- package/stubs/main.ts +2 -2
- package/stubs/ui/react/components/auth_shell.tsx +19 -19
- package/stubs/ui/react/pages/account/login.tsx +6 -7
- package/stubs/ui/react/pages/account/mfa.tsx +16 -15
- package/stubs/ui/react/pages/account/tokens.tsx +27 -17
- package/stubs/ui/react/pages/consent.tsx +12 -12
- package/stubs/ui/react/pages/forgot.tsx +7 -7
- package/stubs/ui/react/pages/login.tsx +22 -24
- package/stubs/ui/react/pages/mfa-challenge.tsx +9 -10
- package/stubs/ui/react/pages/reset.tsx +10 -10
- package/stubs/ui/react/pages/signup.tsx +30 -16
- package/stubs/ui/react/pages/verify-email.tsx +6 -6
- package/build/src/host/ui-dist/assets/index-BmI_J87g.js +0 -137
|
@@ -13,13 +13,7 @@ export function buildImpersonationPanel(cfg, targetId) {
|
|
|
13
13
|
const auth = client.clientSecret
|
|
14
14
|
? ` -u '${client.clientId}:${client.clientSecret}' \\\n`
|
|
15
15
|
: ` -d 'client_id=${client.clientId}' \\\n`;
|
|
16
|
-
const curl = `curl -X POST '${tokenEndpoint}' \\\n
|
|
17
|
-
auth +
|
|
18
|
-
` -d 'grant_type=${TOKEN_EXCHANGE}' \\\n` +
|
|
19
|
-
` -d 'subject_token=<ADMIN_ACCESS_TOKEN>' \\\n` +
|
|
20
|
-
` -d 'subject_token_type=${ACCESS_TOKEN_TYPE}' \\\n` +
|
|
21
|
-
` -d 'requested_subject=${targetId}' \\\n` +
|
|
22
|
-
` -d 'scope=openid profile email'`;
|
|
16
|
+
const curl = `curl -X POST '${tokenEndpoint}' \\\n${auth} -d 'grant_type=${TOKEN_EXCHANGE}' \\\n -d 'subject_token=<ADMIN_ACCESS_TOKEN>' \\\n -d 'subject_token_type=${ACCESS_TOKEN_TYPE}' \\\n -d 'requested_subject=${targetId}' \\\n -d 'scope=openid profile email'`;
|
|
23
17
|
return {
|
|
24
18
|
tokenEndpoint,
|
|
25
19
|
grantType: TOKEN_EXCHANGE,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import type { ManagedKeyInfo } from '../keys/keystore.js';
|
|
1
2
|
import { type ResolvedKeyRotationSetting } from './key_rotation.js';
|
|
2
3
|
import type { SettingsCapability } from './runtime_settings.js';
|
|
3
|
-
import type { ManagedKeyInfo } from '../keys/keystore.js';
|
|
4
4
|
/**
|
|
5
5
|
* Ações compartilhadas de rotação de chave. Funções puras-ish que tanto a Admin
|
|
6
6
|
* REST API (Bearer) quanto o console (sessão) chamam, evitando duplicar a lógica
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { supportsAccountStatus, supportsEmailVerificationStatus, supportsPasswordExpiration, } from '../accounts/account_store.js';
|
|
2
2
|
import { createAccountLockout } from './account_lockout.js';
|
|
3
|
-
import {
|
|
3
|
+
import { resolveEffectiveAccountExpiration, resolveEffectiveLockout, resolveEffectivePasswordExpiration, resolveEffectiveRequireVerifiedEmail, resolveEffectiveRequireVerifiedEmailFull, } from './runtime_toggles.js';
|
|
4
4
|
/**
|
|
5
5
|
* `requireVerifiedEmail` efetivo (config ou runtime setting) E o store sabe dizer
|
|
6
6
|
* se o e-mail está verificado E a conta NÃO está verificada → bloqueia.
|
|
@@ -97,7 +97,12 @@ export async function isAccountExpired(audit, accountId, settings, logger) {
|
|
|
97
97
|
return false;
|
|
98
98
|
try {
|
|
99
99
|
// Busca o último login.success da conta (ordem desc, limit 1).
|
|
100
|
-
const result = await audit.list({
|
|
100
|
+
const result = await audit.list({
|
|
101
|
+
type: 'login.success',
|
|
102
|
+
subject: accountId,
|
|
103
|
+
page: 1,
|
|
104
|
+
limit: 1,
|
|
105
|
+
});
|
|
101
106
|
if (result.data.length === 0) {
|
|
102
107
|
// Nunca logou → considera ativa (conta nova, não inativa).
|
|
103
108
|
return false;
|
|
@@ -163,7 +168,13 @@ export async function attemptPasswordLogin(cfg, input) {
|
|
|
163
168
|
// de adivinhar senha).
|
|
164
169
|
if (supportsAccountStatus(cfg.accountStore) && (await cfg.accountStore.isDisabled(account.id))) {
|
|
165
170
|
await cfg.audit?.record(input.clientId !== undefined
|
|
166
|
-
? {
|
|
171
|
+
? {
|
|
172
|
+
type: 'login.failure',
|
|
173
|
+
email,
|
|
174
|
+
ip,
|
|
175
|
+
clientId: input.clientId,
|
|
176
|
+
metadata: { reason: 'disabled' },
|
|
177
|
+
}
|
|
167
178
|
: { type: 'login.failure', email, ip, metadata: { reason: 'disabled' } });
|
|
168
179
|
return { ok: false, locked: false, disabled: true };
|
|
169
180
|
}
|
|
@@ -173,7 +184,13 @@ export async function attemptPasswordLogin(cfg, input) {
|
|
|
173
184
|
if (await isEmailUnverifiedBlock(cfg, account.id, input.settings)) {
|
|
174
185
|
await lockout.clearFailures(email);
|
|
175
186
|
await cfg.audit?.record(input.clientId !== undefined
|
|
176
|
-
? {
|
|
187
|
+
? {
|
|
188
|
+
type: 'login.failure',
|
|
189
|
+
email,
|
|
190
|
+
ip,
|
|
191
|
+
clientId: input.clientId,
|
|
192
|
+
metadata: { reason: 'unverified' },
|
|
193
|
+
}
|
|
177
194
|
: { type: 'login.failure', email, ip, metadata: { reason: 'unverified' } });
|
|
178
195
|
return { ok: false, locked: false, unverified: true };
|
|
179
196
|
}
|
|
@@ -186,7 +203,13 @@ export async function attemptPasswordLogin(cfg, input) {
|
|
|
186
203
|
// Não é uma falha de credenciais — limpa o contador.
|
|
187
204
|
await lockout.clearFailures(email);
|
|
188
205
|
await cfg.audit?.record(input.clientId !== undefined
|
|
189
|
-
? {
|
|
206
|
+
? {
|
|
207
|
+
type: 'password.expired_change_forced',
|
|
208
|
+
accountId: account.id,
|
|
209
|
+
email,
|
|
210
|
+
ip,
|
|
211
|
+
clientId: input.clientId,
|
|
212
|
+
}
|
|
190
213
|
: { type: 'password.expired_change_forced', accountId: account.id, email, ip });
|
|
191
214
|
return { ok: false, locked: false, passwordExpired: true, account: account };
|
|
192
215
|
}
|
|
@@ -200,7 +223,13 @@ export async function attemptPasswordLogin(cfg, input) {
|
|
|
200
223
|
if (expired) {
|
|
201
224
|
await lockout.clearFailures(email);
|
|
202
225
|
await cfg.audit?.record(input.clientId !== undefined
|
|
203
|
-
? {
|
|
226
|
+
? {
|
|
227
|
+
type: 'account.expired_login_blocked',
|
|
228
|
+
accountId: account.id,
|
|
229
|
+
email,
|
|
230
|
+
ip,
|
|
231
|
+
clientId: input.clientId,
|
|
232
|
+
}
|
|
204
233
|
: { type: 'account.expired_login_blocked', accountId: account.id, email, ip });
|
|
205
234
|
return { ok: false, locked: false, accountExpired: true };
|
|
206
235
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sendNewDeviceLoginEmail, sendNewLoginEmail } from './default_mailer.js';
|
|
2
2
|
import { TRUSTED_DEVICE_COOKIE, isTrustedDeviceValid } from './trusted_device.js';
|
|
3
3
|
/**
|
|
4
4
|
* Centraliza o pós-login bem-sucedido: registra o evento `login.success` e dispara
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import '../augmentations.js';
|
|
2
|
+
import { getAccountLoginUrl } from '../account_login_url.js';
|
|
2
3
|
export const ACCOUNT_SESSION_KEY = 'account_user_id';
|
|
3
4
|
export default class AccountAuthMiddleware {
|
|
4
5
|
async handle(ctx, next) {
|
|
5
6
|
const userId = ctx.session.get(ACCOUNT_SESSION_KEY);
|
|
6
7
|
if (!userId) {
|
|
7
|
-
|
|
8
|
+
// Destino configurável (`accountLoginUrl`): default `/account/login`.
|
|
9
|
+
return ctx.response.redirect(getAccountLoginUrl());
|
|
8
10
|
}
|
|
9
11
|
return next();
|
|
10
12
|
}
|
|
@@ -83,9 +83,7 @@ let limiterPromise;
|
|
|
83
83
|
async function loadLimiter() {
|
|
84
84
|
if (!limiterPromise) {
|
|
85
85
|
const spec = '@adonisjs/limiter/services/main';
|
|
86
|
-
limiterPromise = import(__rewriteRelativeImportExtension(spec))
|
|
87
|
-
.then((m) => m.default ?? null)
|
|
88
|
-
.catch(() => null);
|
|
86
|
+
limiterPromise = import(__rewriteRelativeImportExtension(spec)).then((m) => m.default ?? null).catch(() => null);
|
|
89
87
|
}
|
|
90
88
|
return limiterPromise;
|
|
91
89
|
}
|
|
@@ -78,7 +78,7 @@ export function createAuthThrottles(config) {
|
|
|
78
78
|
// Introspecção de PAT: keyed pelo bearer secret quando presente, senão por IP.
|
|
79
79
|
introspection: buildThrottle('authkit_pat_introspection', config.introspection, config.store, (ctx) => {
|
|
80
80
|
const auth = ctx.request.header('authorization');
|
|
81
|
-
if (auth
|
|
81
|
+
if (auth?.toLowerCase().startsWith('bearer ')) {
|
|
82
82
|
return `bearer:${auth.slice(7).trim()}`;
|
|
83
83
|
}
|
|
84
84
|
return undefined;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Router } from '@adonisjs/core/http';
|
|
2
2
|
import type { AuthSocialConfig, RateLimitConfigInput } from '../define_config.js';
|
|
3
|
+
import { type AccountPathsOptions } from './account_paths.js';
|
|
3
4
|
import type { SudoMethod } from './sudo/types.js';
|
|
4
5
|
/** Chave da sessão Adonis que registra o timestamp da última atividade (idle timeout). */
|
|
5
6
|
export declare const ACCOUNT_LAST_SEEN_KEY = "authkit_last_seen";
|
|
@@ -7,9 +8,11 @@ export declare const ACCOUNT_LAST_SEEN_KEY = "authkit_last_seen";
|
|
|
7
8
|
* Guard do console admin (B6). Como o `accountGuard`, é uma closure inline (forma
|
|
8
9
|
* confiável do `.use()` num grupo). Exige:
|
|
9
10
|
* 0. `config.admin.enabled` ligado (senão → 404; ver nota de flag-drift abaixo);
|
|
10
|
-
* 1. sessão de conta ativa (senão → /account/login);
|
|
11
|
+
* 1. sessão de conta ativa (senão → `accountLoginUrl`, default /account/login);
|
|
11
12
|
* 2. a conta logada com pelo menos UMA das `config.admin.roles` nas roles globais
|
|
12
|
-
* (senão → /account/
|
|
13
|
+
* (senão → `accountHome(cfg)`, default /account/security — NÃO revela a
|
|
14
|
+
* existência do /admin, e cai numa tela que o host controla via `accountHome`;
|
|
15
|
+
* se a tela default estiver desmontada, aponte `config.accountHome` para uma montada).
|
|
13
16
|
* As roles permitidas são resolvidas em runtime do `authkit.server` (config lazy).
|
|
14
17
|
*/
|
|
15
18
|
export declare const adminGuard: (ctx: any, next: () => Promise<void>) => Promise<any>;
|
|
@@ -108,6 +111,97 @@ export interface AuthHostOptions {
|
|
|
108
111
|
* Ausente → `[password(), passkey()]`.
|
|
109
112
|
*/
|
|
110
113
|
sudoMethods?: SudoMethod[];
|
|
114
|
+
/**
|
|
115
|
+
* Montagem por tela do console de conta (`/account/*`). Espelha o padrão
|
|
116
|
+
* `admin`/`adminApi`: a decisão de MONTAR cada grupo de rotas é tomada em
|
|
117
|
+
* tempo de registro, antes de o config (lazy) resolver.
|
|
118
|
+
*
|
|
119
|
+
* - Ausente → tudo montado (back-compat total).
|
|
120
|
+
* - `false` → NENHUMA tela do console de conta é montada (as rotas sudo
|
|
121
|
+
* `/account/confirm` e a JSON API `/account/api/*` continuam — são
|
|
122
|
+
* infraestrutura, não telas navegáveis).
|
|
123
|
+
* - objeto → montagem seletiva; cada flag ausente default `true`.
|
|
124
|
+
* - `login` → `/account/login`, `/account/logout` (a porta por senha do console).
|
|
125
|
+
* - `tokens` → `/account/tokens*` (Personal Access Tokens).
|
|
126
|
+
* - `orgs` → `/account/orgs*` (multi-tenancy, incl. o accept de convite público).
|
|
127
|
+
* - `security` → `/account/security*` + `/account/email/confirm` (perfil, senha, troca de e-mail, export/LGPD, deleção).
|
|
128
|
+
* - `mfa` → `/account/mfa*` (TOTP + passkeys).
|
|
129
|
+
* - `apps` → `/account/apps*` (grants de consentimento OIDC).
|
|
130
|
+
*
|
|
131
|
+
* NOTA (flag-drift): como `admin`/`adminApi`, estas flags controlam apenas se
|
|
132
|
+
* as ROTAS existem; o comportamento em runtime continua vindo do config
|
|
133
|
+
* resolvido. Mantenha em sincronia — os guards são a rede de segurança.
|
|
134
|
+
*
|
|
135
|
+
* ⚠️ Ao desmontar `login`, os redirects internos de "faça login"
|
|
136
|
+
* (`accountGuard`, `adminGuard`, `AccountAuthMiddleware`, `consoleLoginUrl()`,
|
|
137
|
+
* a view `otp-unlock`) apontariam para uma rota inexistente — passe
|
|
138
|
+
* `accountLoginUrl` com a rota de login do host (ex.: `'/login'`).
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* // Console passwordless: só segurança + MFA, login delegado ao OIDC do host.
|
|
142
|
+
* registerAuthHost(router, {
|
|
143
|
+
* account: { login: false, tokens: false, orgs: false },
|
|
144
|
+
* accountLoginUrl: '/login',
|
|
145
|
+
* })
|
|
146
|
+
*/
|
|
147
|
+
account?: false | AccountScreensOptions;
|
|
148
|
+
/**
|
|
149
|
+
* Destino do redirect de "não-autenticado → faça login" do console de conta.
|
|
150
|
+
* Default `/account/login`. Aponte para a rota de login do host quando a tela
|
|
151
|
+
* `account/login` da lib estiver desmontada (`account: { login: false }`).
|
|
152
|
+
*
|
|
153
|
+
* Usado por TODOS os pontos de redirect/link de login: `accountGuard`,
|
|
154
|
+
* `adminGuard`, `AccountAuthMiddleware`, `consoleLoginUrl()`, os fallbacks dos
|
|
155
|
+
* controllers de conta e a view `otp-unlock`. Ver `account_login_url.ts`.
|
|
156
|
+
*/
|
|
157
|
+
accountLoginUrl?: string;
|
|
158
|
+
/**
|
|
159
|
+
* Prefixo e segmentos de tela CONFIGURÁVEIS/LOCALIZÁVEIS do console de conta
|
|
160
|
+
* (`/account/*`). Top-level (e não dentro de `account`) DE PROPÓSITO: mesmo
|
|
161
|
+
* com `account: false`, a lib continua montando as rotas de sudo
|
|
162
|
+
* (`/account/confirm*`) e a JSON API (`/account/api/*`) — o prefixo precisa
|
|
163
|
+
* valer para essa infraestrutura também, então ele não pode viver debaixo da
|
|
164
|
+
* flag que desmonta as telas navegáveis.
|
|
165
|
+
*
|
|
166
|
+
* - `prefix` troca o `/account` base (ex.: `'/conta'`).
|
|
167
|
+
* - `paths` traduz cada TELA navegável (ex.: `{ security: 'seguranca',
|
|
168
|
+
* confirm: 'confirmar' }`).
|
|
169
|
+
*
|
|
170
|
+
* Só o prefixo e o segmento de tela são renomeáveis — os action-subpaths dos
|
|
171
|
+
* POSTs internos (`/password`, `/enroll`, `/passkeys/verify`, ...) e o
|
|
172
|
+
* segmento `api` da JSON API são FIXOS (endpoints de máquina, invisíveis ao
|
|
173
|
+
* usuário). Ver `account_paths.ts`.
|
|
174
|
+
*
|
|
175
|
+
* Ausente → tudo idêntico a hoje (`/account/...` — back-compat total).
|
|
176
|
+
*
|
|
177
|
+
* @example
|
|
178
|
+
* // Console em português: /conta/seguranca, /conta/confirmar, ...
|
|
179
|
+
* registerAuthHost(router, {
|
|
180
|
+
* accountRoutes: {
|
|
181
|
+
* prefix: '/conta',
|
|
182
|
+
* paths: { security: 'seguranca', confirm: 'confirmar', mfa: 'mfa' },
|
|
183
|
+
* },
|
|
184
|
+
* })
|
|
185
|
+
*/
|
|
186
|
+
accountRoutes?: AccountPathsOptions;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Flags de montagem por tela do console de conta. Cada campo ausente é `true`
|
|
190
|
+
* (montado). Ver {@link AuthHostOptions.account}.
|
|
191
|
+
*/
|
|
192
|
+
export interface AccountScreensOptions {
|
|
193
|
+
/** Tela de login por senha do console (`/account/login`, `/account/logout`). */
|
|
194
|
+
login?: boolean;
|
|
195
|
+
/** Personal Access Tokens (`/account/tokens*`). */
|
|
196
|
+
tokens?: boolean;
|
|
197
|
+
/** Organizations / multi-tenancy (`/account/orgs*`). */
|
|
198
|
+
orgs?: boolean;
|
|
199
|
+
/** Perfil, senha, troca de e-mail, export/LGPD e deleção (`/account/security*`). */
|
|
200
|
+
security?: boolean;
|
|
201
|
+
/** MFA — TOTP + passkeys (`/account/mfa*`). */
|
|
202
|
+
mfa?: boolean;
|
|
203
|
+
/** Apps com acesso / grants de consentimento OIDC (`/account/apps*`). */
|
|
204
|
+
apps?: boolean;
|
|
111
205
|
}
|
|
112
206
|
/**
|
|
113
207
|
* Monta todas as rotas do host-kit do Authorization Server numa chamada.
|