@adonis-agora/authkit-server 0.34.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/LICENSE +21 -0
- package/README.md +158 -0
- package/build/assets/grafana/authkit-dashboard.json +118 -0
- package/build/commands/clients_create.d.ts +27 -0
- package/build/commands/clients_create.js +121 -0
- package/build/commands/commands.json +292 -0
- package/build/commands/configure.d.ts +2 -0
- package/build/commands/configure.js +45 -0
- package/build/commands/doctor.d.ts +10 -0
- package/build/commands/doctor.js +113 -0
- package/build/commands/eject.d.ts +11 -0
- package/build/commands/eject.js +96 -0
- package/build/commands/expire_scan.d.ts +28 -0
- package/build/commands/expire_scan.js +92 -0
- package/build/commands/import_users.d.ts +17 -0
- package/build/commands/import_users.js +80 -0
- package/build/commands/keys_rotate.d.ts +21 -0
- package/build/commands/keys_rotate.js +126 -0
- package/build/commands/main.d.ts +12 -0
- package/build/commands/main.js +38 -0
- package/build/commands/settings_get.d.ts +18 -0
- package/build/commands/settings_get.js +43 -0
- package/build/commands/settings_list.d.ts +17 -0
- package/build/commands/settings_list.js +39 -0
- package/build/commands/settings_set.d.ts +20 -0
- package/build/commands/settings_set.js +55 -0
- package/build/commands/settings_unset.d.ts +18 -0
- package/build/commands/settings_unset.js +46 -0
- package/build/commands/ui_preset.d.ts +4 -0
- package/build/commands/ui_preset.js +32 -0
- package/build/database/migrations/make_authkit_oidc_table.d.ts +6 -0
- package/build/database/migrations/make_authkit_oidc_table.js +19 -0
- package/build/host/ui/admin.html +29 -0
- package/build/host/views/account/apps.edge +59 -0
- package/build/host/views/account/confirm.edge +70 -0
- package/build/host/views/account/email-confirmed.edge +16 -0
- package/build/host/views/account/login.edge +33 -0
- package/build/host/views/account/mfa.edge +152 -0
- package/build/host/views/account/orgs.edge +58 -0
- package/build/host/views/account/security.edge +215 -0
- package/build/host/views/account/tokens.edge +75 -0
- package/build/host/views/consent.edge +20 -0
- package/build/host/views/forgot.edge +43 -0
- package/build/host/views/login.edge +251 -0
- package/build/host/views/maintenance.edge +32 -0
- package/build/host/views/mfa-challenge.edge +107 -0
- package/build/host/views/otp-unlock.edge +40 -0
- package/build/host/views/partials/styles.edge +2 -0
- package/build/host/views/reset.edge +30 -0
- package/build/host/views/signup.edge +62 -0
- package/build/host/views/verify-email.edge +17 -0
- package/build/index.d.ts +115 -0
- package/build/index.js +76 -0
- package/build/password/common_passwords.txt +10000 -0
- package/build/providers/authkit_server_provider.d.ts +27 -0
- package/build/providers/authkit_server_provider.js +242 -0
- package/build/src/accounts/account_store.d.ts +578 -0
- package/build/src/accounts/account_store.js +60 -0
- package/build/src/accounts/lucid_account_store.d.ts +156 -0
- package/build/src/accounts/lucid_account_store.js +294 -0
- package/build/src/accounts/lucid_store/core.d.ts +9 -0
- package/build/src/accounts/lucid_store/core.js +306 -0
- package/build/src/accounts/lucid_store/mfa.d.ts +15 -0
- package/build/src/accounts/lucid_store/mfa.js +108 -0
- package/build/src/accounts/lucid_store/organizations.d.ts +13 -0
- package/build/src/accounts/lucid_store/organizations.js +294 -0
- package/build/src/accounts/lucid_store/password_hygiene.d.ts +20 -0
- package/build/src/accounts/lucid_store/password_hygiene.js +130 -0
- package/build/src/accounts/lucid_store/provider_identity.d.ts +8 -0
- package/build/src/accounts/lucid_store/provider_identity.js +59 -0
- package/build/src/accounts/lucid_store/shared.d.ts +113 -0
- package/build/src/accounts/lucid_store/shared.js +130 -0
- package/build/src/accounts/lucid_store/status_profile.d.ts +34 -0
- package/build/src/accounts/lucid_store/status_profile.js +100 -0
- package/build/src/accounts/lucid_store/webauthn.d.ts +8 -0
- package/build/src/accounts/lucid_store/webauthn.js +140 -0
- package/build/src/accounts/lucid_stores.d.ts +45 -0
- package/build/src/accounts/lucid_stores.js +30 -0
- package/build/src/adapters/adapter_contract.d.ts +37 -0
- package/build/src/adapters/adapter_contract.js +1 -0
- package/build/src/adapters/database_adapter.d.ts +21 -0
- package/build/src/adapters/database_adapter.js +79 -0
- package/build/src/adapters/factory.d.ts +30 -0
- package/build/src/adapters/factory.js +43 -0
- package/build/src/adapters/redis_adapter.d.ts +24 -0
- package/build/src/adapters/redis_adapter.js +122 -0
- package/build/src/audit/audit_sink.d.ts +63 -0
- package/build/src/audit/audit_sink.js +1 -0
- package/build/src/audit/lucid_audit_sink.d.ts +10 -0
- package/build/src/audit/lucid_audit_sink.js +99 -0
- package/build/src/commands/expire_scan_command.d.ts +60 -0
- package/build/src/commands/expire_scan_command.js +229 -0
- package/build/src/commands/import_clients.d.ts +40 -0
- package/build/src/commands/import_clients.js +79 -0
- package/build/src/commands/import_users.d.ts +51 -0
- package/build/src/commands/import_users.js +94 -0
- package/build/src/commands/resolve_config.d.ts +13 -0
- package/build/src/commands/resolve_config.js +18 -0
- package/build/src/commands/settings_commands.d.ts +47 -0
- package/build/src/commands/settings_commands.js +270 -0
- package/build/src/controllers/oidc_callback_controller.d.ts +22 -0
- package/build/src/controllers/oidc_callback_controller.js +33 -0
- package/build/src/define_config.d.ts +772 -0
- package/build/src/define_config.js +351 -0
- package/build/src/doctor/checks.d.ts +197 -0
- package/build/src/doctor/checks.js +858 -0
- package/build/src/events/dispatcher.d.ts +45 -0
- package/build/src/events/dispatcher.js +117 -0
- package/build/src/host/account_api/account_api_controller.d.ts +245 -0
- package/build/src/host/account_api/account_api_controller.js +827 -0
- package/build/src/host/account_deletion_ops.d.ts +80 -0
- package/build/src/host/account_deletion_ops.js +118 -0
- package/build/src/host/account_deletion_service.d.ts +63 -0
- package/build/src/host/account_deletion_service.js +133 -0
- package/build/src/host/account_export_service.d.ts +76 -0
- package/build/src/host/account_export_service.js +140 -0
- package/build/src/host/account_home.d.ts +11 -0
- package/build/src/host/account_home.js +11 -0
- package/build/src/host/account_lockout.d.ts +86 -0
- package/build/src/host/account_lockout.js +185 -0
- package/build/src/host/active_org_cookie.d.ts +28 -0
- package/build/src/host/active_org_cookie.js +47 -0
- package/build/src/host/admin_api/admin_api_guard.d.ts +16 -0
- package/build/src/host/admin_api/admin_api_guard.js +59 -0
- package/build/src/host/admin_api/admin_orgs_service.d.ts +125 -0
- package/build/src/host/admin_api/admin_orgs_service.js +324 -0
- package/build/src/host/admin_api/admin_users_service.d.ts +163 -0
- package/build/src/host/admin_api/admin_users_service.js +308 -0
- package/build/src/host/admin_api/api_clients_controller.d.ts +54 -0
- package/build/src/host/admin_api/api_clients_controller.js +89 -0
- package/build/src/host/admin_api/api_keys_controller.d.ts +19 -0
- package/build/src/host/admin_api/api_keys_controller.js +36 -0
- package/build/src/host/admin_api/api_misc_controller.d.ts +19 -0
- package/build/src/host/admin_api/api_misc_controller.js +44 -0
- package/build/src/host/admin_api/api_orgs_controller.d.ts +108 -0
- package/build/src/host/admin_api/api_orgs_controller.js +189 -0
- package/build/src/host/admin_api/api_settings_controller.d.ts +55 -0
- package/build/src/host/admin_api/api_settings_controller.js +134 -0
- package/build/src/host/admin_api/api_users_controller.d.ts +108 -0
- package/build/src/host/admin_api/api_users_controller.js +187 -0
- package/build/src/host/admin_api/dto.d.ts +131 -0
- package/build/src/host/admin_api/dto.js +122 -0
- package/build/src/host/admin_api/token_verify_service.d.ts +34 -0
- package/build/src/host/admin_api/token_verify_service.js +74 -0
- package/build/src/host/admin_clients_service.d.ts +88 -0
- package/build/src/host/admin_clients_service.js +181 -0
- package/build/src/host/admin_console/admin_shell_controller.d.ts +27 -0
- package/build/src/host/admin_console/admin_shell_controller.js +167 -0
- package/build/src/host/admin_console/console_audit_controller.d.ts +17 -0
- package/build/src/host/admin_console/console_audit_controller.js +25 -0
- package/build/src/host/admin_console/console_clients_controller.d.ts +53 -0
- package/build/src/host/admin_console/console_clients_controller.js +102 -0
- package/build/src/host/admin_console/console_impersonation_controller.d.ts +23 -0
- package/build/src/host/admin_console/console_impersonation_controller.js +45 -0
- package/build/src/host/admin_console/console_keys_controller.d.ts +24 -0
- package/build/src/host/admin_console/console_keys_controller.js +41 -0
- package/build/src/host/admin_console/console_orgs_controller.d.ts +96 -0
- package/build/src/host/admin_console/console_orgs_controller.js +238 -0
- package/build/src/host/admin_console/console_overview_controller.d.ts +27 -0
- package/build/src/host/admin_console/console_overview_controller.js +44 -0
- package/build/src/host/admin_console/console_roles_controller.d.ts +31 -0
- package/build/src/host/admin_console/console_roles_controller.js +108 -0
- package/build/src/host/admin_console/console_sessions_controller.d.ts +91 -0
- package/build/src/host/admin_console/console_sessions_controller.js +125 -0
- package/build/src/host/admin_console/console_settings_controller.d.ts +47 -0
- package/build/src/host/admin_console/console_settings_controller.js +115 -0
- package/build/src/host/admin_console/console_users_controller.d.ts +110 -0
- package/build/src/host/admin_console/console_users_controller.js +212 -0
- package/build/src/host/admin_prefix.d.ts +50 -0
- package/build/src/host/admin_prefix.js +77 -0
- package/build/src/host/admin_sessions_service.d.ts +119 -0
- package/build/src/host/admin_sessions_service.js +284 -0
- package/build/src/host/admin_stats_service.d.ts +44 -0
- package/build/src/host/admin_stats_service.js +130 -0
- package/build/src/host/admin_validators.d.ts +247 -0
- package/build/src/host/admin_validators.js +197 -0
- package/build/src/host/augmentations.d.ts +12 -0
- package/build/src/host/augmentations.js +1 -0
- package/build/src/host/auth_host_config.d.ts +22 -0
- package/build/src/host/auth_host_config.js +13 -0
- package/build/src/host/avatar_storage.d.ts +68 -0
- package/build/src/host/avatar_storage.js +166 -0
- package/build/src/host/bot_protection.d.ts +187 -0
- package/build/src/host/bot_protection.js +132 -0
- package/build/src/host/branding.d.ts +19 -0
- package/build/src/host/branding.js +8 -0
- package/build/src/host/config_locks.d.ts +38 -0
- package/build/src/host/config_locks.js +70 -0
- package/build/src/host/console_session.d.ts +27 -0
- package/build/src/host/console_session.js +36 -0
- package/build/src/host/controllers/account_apps_controller.d.ts +15 -0
- package/build/src/host/controllers/account_apps_controller.js +61 -0
- package/build/src/host/controllers/account_confirm_controller.d.ts +24 -0
- package/build/src/host/controllers/account_confirm_controller.js +144 -0
- package/build/src/host/controllers/account_mfa_controller.d.ts +28 -0
- package/build/src/host/controllers/account_mfa_controller.js +208 -0
- package/build/src/host/controllers/account_orgs_controller.d.ts +80 -0
- package/build/src/host/controllers/account_orgs_controller.js +401 -0
- package/build/src/host/controllers/account_security_controller.d.ts +43 -0
- package/build/src/host/controllers/account_security_controller.js +546 -0
- package/build/src/host/controllers/account_session_controller.d.ts +21 -0
- package/build/src/host/controllers/account_session_controller.js +113 -0
- package/build/src/host/controllers/account_tokens_controller.d.ts +7 -0
- package/build/src/host/controllers/account_tokens_controller.js +67 -0
- package/build/src/host/controllers/interaction_controller.d.ts +125 -0
- package/build/src/host/controllers/interaction_controller.js +981 -0
- package/build/src/host/controllers/pat_introspection_controller.d.ts +22 -0
- package/build/src/host/controllers/pat_introspection_controller.js +46 -0
- package/build/src/host/controllers/registration_controller.d.ts +18 -0
- package/build/src/host/controllers/registration_controller.js +382 -0
- package/build/src/host/controllers/social_controller.d.ts +8 -0
- package/build/src/host/controllers/social_controller.js +89 -0
- package/build/src/host/csrf.d.ts +29 -0
- package/build/src/host/csrf.js +14 -0
- package/build/src/host/default_mailer.d.ts +112 -0
- package/build/src/host/default_mailer.js +417 -0
- package/build/src/host/durable/account_deletion_workflow.d.ts +48 -0
- package/build/src/host/durable/account_deletion_workflow.js +86 -0
- package/build/src/host/durable/account_export_workflow.d.ts +68 -0
- package/build/src/host/durable/account_export_workflow.js +93 -0
- package/build/src/host/durable/index.d.ts +68 -0
- package/build/src/host/durable/index.js +77 -0
- package/build/src/host/email_templates.d.ts +39 -0
- package/build/src/host/email_templates.js +69 -0
- package/build/src/host/geo.d.ts +22 -0
- package/build/src/host/geo.js +39 -0
- package/build/src/host/i18n.d.ts +1416 -0
- package/build/src/host/i18n.js +1583 -0
- package/build/src/host/impersonation.d.ts +25 -0
- package/build/src/host/impersonation.js +31 -0
- package/build/src/host/key_rotation.d.ts +14 -0
- package/build/src/host/key_rotation.js +27 -0
- package/build/src/host/key_rotation_actions.d.ts +42 -0
- package/build/src/host/key_rotation_actions.js +27 -0
- package/build/src/host/login_attempt.d.ts +98 -0
- package/build/src/host/login_attempt.js +211 -0
- package/build/src/host/login_notify.d.ts +27 -0
- package/build/src/host/login_notify.js +142 -0
- package/build/src/host/middleware/account_auth.d.ts +7 -0
- package/build/src/host/middleware/account_auth.js +11 -0
- package/build/src/host/otp_lockout.d.ts +103 -0
- package/build/src/host/otp_lockout.js +221 -0
- package/build/src/host/rate_limit.d.ts +39 -0
- package/build/src/host/rate_limit.js +94 -0
- package/build/src/host/register_auth_host.d.ts +97 -0
- package/build/src/host/register_auth_host.js +466 -0
- package/build/src/host/renderers/edge_renderer.d.ts +12 -0
- package/build/src/host/renderers/edge_renderer.js +38 -0
- package/build/src/host/renderers/inertia_renderer.d.ts +70 -0
- package/build/src/host/renderers/inertia_renderer.js +54 -0
- package/build/src/host/runtime_settings.d.ts +181 -0
- package/build/src/host/runtime_settings.js +307 -0
- package/build/src/host/runtime_toggles.d.ts +807 -0
- package/build/src/host/runtime_toggles.js +784 -0
- package/build/src/host/security_notice_service.d.ts +36 -0
- package/build/src/host/security_notice_service.js +87 -0
- package/build/src/host/session_context.d.ts +23 -0
- package/build/src/host/session_context.js +89 -0
- package/build/src/host/sudo_mode.d.ts +56 -0
- package/build/src/host/sudo_mode.js +99 -0
- package/build/src/host/svg_chart.d.ts +15 -0
- package/build/src/host/svg_chart.js +45 -0
- package/build/src/host/trusted_device.d.ts +61 -0
- package/build/src/host/trusted_device.js +65 -0
- package/build/src/host/ui-dist/assets/index-CRWcmsex.js +137 -0
- package/build/src/host/ui-dist/assets/index-DTSmD4RU.css +1 -0
- package/build/src/host/ui-dist/index.html +17 -0
- package/build/src/host/user_agent.d.ts +18 -0
- package/build/src/host/user_agent.js +50 -0
- package/build/src/host/validators.d.ts +127 -0
- package/build/src/host/validators.js +53 -0
- package/build/src/keys/jwks_manager.d.ts +6 -0
- package/build/src/keys/jwks_manager.js +11 -0
- package/build/src/keys/keystore.d.ts +52 -0
- package/build/src/keys/keystore.js +68 -0
- package/build/src/keys/keystore_codec.d.ts +20 -0
- package/build/src/keys/keystore_codec.js +42 -0
- package/build/src/keys/keystore_crypto.d.ts +9 -0
- package/build/src/keys/keystore_crypto.js +27 -0
- package/build/src/keys/keystore_manager.d.ts +43 -0
- package/build/src/keys/keystore_manager.js +104 -0
- package/build/src/keys/keystore_vault.d.ts +113 -0
- package/build/src/keys/keystore_vault.js +265 -0
- package/build/src/mixins/json_column.d.ts +33 -0
- package/build/src/mixins/json_column.js +38 -0
- package/build/src/mixins/with_audit_log.d.ts +19 -0
- package/build/src/mixins/with_audit_log.js +39 -0
- package/build/src/mixins/with_auth_user.d.ts +24 -0
- package/build/src/mixins/with_auth_user.js +46 -0
- package/build/src/mixins/with_credentials.d.ts +20 -0
- package/build/src/mixins/with_credentials.js +29 -0
- package/build/src/mixins/with_mfa.d.ts +35 -0
- package/build/src/mixins/with_mfa.js +21 -0
- package/build/src/mixins/with_personal_access_token.d.ts +19 -0
- package/build/src/mixins/with_personal_access_token.js +42 -0
- package/build/src/mixins/with_provider_identity.d.ts +20 -0
- package/build/src/mixins/with_provider_identity.js +32 -0
- package/build/src/mixins/with_webauthn_credential.d.ts +37 -0
- package/build/src/mixins/with_webauthn_credential.js +46 -0
- package/build/src/observability/diagnostics_bridge.d.ts +6 -0
- package/build/src/observability/diagnostics_bridge.js +27 -0
- package/build/src/observability/metrics_controller.d.ts +5 -0
- package/build/src/observability/metrics_controller.js +24 -0
- package/build/src/observability/metrics_service.d.ts +2 -0
- package/build/src/observability/metrics_service.js +7 -0
- package/build/src/observability/otel_recorder.d.ts +10 -0
- package/build/src/observability/otel_recorder.js +59 -0
- package/build/src/observability/telescope/data_providers.d.ts +24 -0
- package/build/src/observability/telescope/data_providers.js +235 -0
- package/build/src/observability/telescope/extension.d.ts +29 -0
- package/build/src/observability/telescope/extension.js +167 -0
- package/build/src/observability/telescope/index.d.ts +8 -0
- package/build/src/observability/telescope/index.js +8 -0
- package/build/src/observability/wire_provider_events.d.ts +12 -0
- package/build/src/observability/wire_provider_events.js +30 -0
- package/build/src/password/common_passwords.d.ts +31 -0
- package/build/src/password/common_passwords.js +73 -0
- package/build/src/password/password_manager.d.ts +163 -0
- package/build/src/password/password_manager.js +191 -0
- package/build/src/password/policy.d.ts +71 -0
- package/build/src/password/policy.js +55 -0
- package/build/src/password/pwned.d.ts +36 -0
- package/build/src/password/pwned.js +52 -0
- package/build/src/pat/lucid_pat_store.d.ts +6 -0
- package/build/src/pat/lucid_pat_store.js +62 -0
- package/build/src/pat/pat_store.d.ts +31 -0
- package/build/src/pat/pat_store.js +1 -0
- package/build/src/pat/pat_tokens.d.ts +4 -0
- package/build/src/pat/pat_tokens.js +9 -0
- package/build/src/provider/build_provider.d.ts +45 -0
- package/build/src/provider/build_provider.js +219 -0
- package/build/src/provider/device_sources.d.ts +6 -0
- package/build/src/provider/device_sources.js +65 -0
- package/build/src/provider/interaction_actions.d.ts +36 -0
- package/build/src/provider/interaction_actions.js +55 -0
- package/build/src/provider/key_rotation_scheduler.d.ts +28 -0
- package/build/src/provider/key_rotation_scheduler.js +40 -0
- package/build/src/provider/keystore_reload.d.ts +21 -0
- package/build/src/provider/keystore_reload.js +39 -0
- package/build/src/provider/logout_sources.d.ts +13 -0
- package/build/src/provider/logout_sources.js +64 -0
- package/build/src/provider/oidc_service.d.ts +81 -0
- package/build/src/provider/oidc_service.js +254 -0
- package/build/src/provider/single_flight_lock.d.ts +18 -0
- package/build/src/provider/single_flight_lock.js +31 -0
- package/build/src/provider/token_exchange.d.ts +21 -0
- package/build/src/provider/token_exchange.js +124 -0
- package/build/src/register_routes.d.ts +16 -0
- package/build/src/register_routes.js +21 -0
- package/build/src/schema/ensure.d.ts +41 -0
- package/build/src/schema/ensure.js +262 -0
- package/build/stubs/config/authkit.stub +20 -0
- package/build/stubs/config/authkit_react.stub +52 -0
- package/build/stubs/main.d.ts +1 -0
- package/build/stubs/main.js +2 -0
- package/build/stubs/models/auth_user.stub +22 -0
- package/build/stubs/ui/edge/views/consent.edge +13 -0
- package/build/stubs/ui/edge/views/login.edge +19 -0
- package/build/stubs/ui/react/components/auth_shell.tsx +67 -0
- package/build/stubs/ui/react/pages/account/login.tsx +56 -0
- package/build/stubs/ui/react/pages/account/mfa.tsx +132 -0
- package/build/stubs/ui/react/pages/account/tokens.tsx +88 -0
- package/build/stubs/ui/react/pages/consent.tsx +39 -0
- package/build/stubs/ui/react/pages/forgot.tsx +44 -0
- package/build/stubs/ui/react/pages/login.tsx +171 -0
- package/build/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
- package/build/stubs/ui/react/pages/reset.tsx +58 -0
- package/build/stubs/ui/react/pages/signup.tsx +78 -0
- package/build/stubs/ui/react/pages/verify-email.tsx +24 -0
- package/build/types.d.ts +7 -0
- package/build/types.js +1 -0
- package/package.json +147 -0
- package/stubs/config/authkit.stub +20 -0
- package/stubs/config/authkit_react.stub +52 -0
- package/stubs/main.ts +2 -0
- package/stubs/models/auth_user.stub +22 -0
- package/stubs/ui/edge/views/consent.edge +13 -0
- package/stubs/ui/edge/views/login.edge +19 -0
- package/stubs/ui/react/components/auth_shell.tsx +67 -0
- package/stubs/ui/react/pages/account/login.tsx +56 -0
- package/stubs/ui/react/pages/account/mfa.tsx +132 -0
- package/stubs/ui/react/pages/account/tokens.tsx +88 -0
- package/stubs/ui/react/pages/consent.tsx +39 -0
- package/stubs/ui/react/pages/forgot.tsx +44 -0
- package/stubs/ui/react/pages/login.tsx +171 -0
- package/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
- package/stubs/ui/react/pages/reset.tsx +58 -0
- package/stubs/ui/react/pages/signup.tsx +78 -0
- package/stubs/ui/react/pages/verify-email.tsx +24 -0
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
/** DTO público da conta — o que o provider e os controllers enxergam. Nunca um model Lucid. */
|
|
2
|
+
export interface AuthAccount {
|
|
3
|
+
id: string;
|
|
4
|
+
email: string;
|
|
5
|
+
globalRoles?: string[];
|
|
6
|
+
name?: string;
|
|
7
|
+
avatarUrl?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CreateAccountInput {
|
|
10
|
+
email: string;
|
|
11
|
+
password: string;
|
|
12
|
+
fullName?: string | null;
|
|
13
|
+
globalRoles?: string[];
|
|
14
|
+
/** social/Google entra como true (provider já verificou o email). Default: false. */
|
|
15
|
+
emailVerified?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Dados para ligar uma identidade de provider a uma conta. */
|
|
18
|
+
export interface LinkProviderIdentityInput {
|
|
19
|
+
accountId: string;
|
|
20
|
+
provider: string;
|
|
21
|
+
providerUserId: string;
|
|
22
|
+
email?: string;
|
|
23
|
+
}
|
|
24
|
+
/** Parâmetros de listagem paginada de contas (console admin). */
|
|
25
|
+
export interface ListAccountsParams {
|
|
26
|
+
/** Filtro por e-mail (substring, case-insensitive). */
|
|
27
|
+
search?: string;
|
|
28
|
+
/** Página (1-based). Default: 1. */
|
|
29
|
+
page?: number;
|
|
30
|
+
/** Itens por página. Default: 20. */
|
|
31
|
+
limit?: number;
|
|
32
|
+
}
|
|
33
|
+
/** Página de resultados + total absoluto (para paginação na UI). */
|
|
34
|
+
export interface Paginated<T> {
|
|
35
|
+
data: T[];
|
|
36
|
+
total: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resumo de uma passkey (credencial WebAuthn) para exibição na UI de gerência.
|
|
40
|
+
* Nunca expõe a chave pública nem o counter.
|
|
41
|
+
*/
|
|
42
|
+
export interface PasskeySummary {
|
|
43
|
+
/** Credential id (base64url). */
|
|
44
|
+
id: string;
|
|
45
|
+
/** Rótulo legível opcional (ex.: nome do dispositivo). */
|
|
46
|
+
label?: string;
|
|
47
|
+
/** ISO timestamp de criação. */
|
|
48
|
+
createdAt: string;
|
|
49
|
+
}
|
|
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 {
|
|
60
|
+
findById(id: string): Promise<AuthAccount | null>;
|
|
61
|
+
verifyCredentials(email: string, password: string): Promise<AuthAccount | null>;
|
|
62
|
+
findByEmail(email: string): Promise<AuthAccount | null>;
|
|
63
|
+
create(input: CreateAccountInput): Promise<AuthAccount>;
|
|
64
|
+
issuePasswordResetToken(email: string): Promise<{
|
|
65
|
+
token: string;
|
|
66
|
+
account: AuthAccount;
|
|
67
|
+
} | null>;
|
|
68
|
+
consumePasswordResetToken(token: string, newPassword: string): Promise<boolean>;
|
|
69
|
+
issueEmailVerificationToken(email: string): Promise<{
|
|
70
|
+
token: string;
|
|
71
|
+
account: AuthAccount;
|
|
72
|
+
} | null>;
|
|
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 {
|
|
81
|
+
/** Lista contas paginadas, opcionalmente filtrando por e-mail. */
|
|
82
|
+
listAccounts(params: ListAccountsParams): Promise<Paginated<AuthAccount>>;
|
|
83
|
+
/** Substitui as roles globais de uma conta. */
|
|
84
|
+
setGlobalRoles(accountId: string, roles: string[]): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Capacidade OPCIONAL: conta eficientemente quantas contas possuem a role
|
|
87
|
+
* global `role` (ex.: para a invariante de "último admin", evitando paginar
|
|
88
|
+
* a base inteira em memória). Retorna o número de contas que têm a role.
|
|
89
|
+
*
|
|
90
|
+
* Por que opcional: o formato de `globalRoles` é host-shaped (coluna JSON,
|
|
91
|
+
* tabela de junção, claim externa, etc.), então a lib NÃO consegue emitir uma
|
|
92
|
+
* query de contagem genérica. Hosts que conhecem o próprio shape implementam
|
|
93
|
+
* isto (ex.: `whereJsonSuperset`/`EXISTS` no dialeto deles). Ausente → o
|
|
94
|
+
* caller usa o fallback de scan paginado via {@link listAccounts}.
|
|
95
|
+
*
|
|
96
|
+
* Use {@link supportsCountByGlobalRole} para estreitar em runtime.
|
|
97
|
+
*/
|
|
98
|
+
countByGlobalRole?(role: string): Promise<number>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Self-service de segurança da conta (console de conta): trocar a senha e o
|
|
102
|
+
* e-mail (com confirmação no NOVO endereço). É uma CAPACIDADE opcional — stores
|
|
103
|
+
* sem suporte omitem os métodos e a UI esconde a seção correspondente.
|
|
104
|
+
*
|
|
105
|
+
* A troca de e-mail usa um token de confirmação que viaja para o NOVO endereço
|
|
106
|
+
* ({@link requestEmailChange}) e é consumido por {@link confirmEmailChange}. O
|
|
107
|
+
* store default (Lucid) reaproveita a coluna `emailVerificationToken` codificando
|
|
108
|
+
* um payload `ec:<email>:<token>` — assim NÃO exige migração nova (ver
|
|
109
|
+
* `lucid_store/core.ts`). O tradeoff é que um token de verificação de cadastro e
|
|
110
|
+
* um de troca de e-mail não coexistem (mesma coluna); na prática são fluxos
|
|
111
|
+
* distintos no tempo.
|
|
112
|
+
*/
|
|
113
|
+
export interface AccountSecurityCapability {
|
|
114
|
+
/**
|
|
115
|
+
* Define uma nova senha para a conta (após o controller confirmar a senha ATUAL
|
|
116
|
+
* via {@link CoreAccountStore.verifyCredentials}). Retorna false se a conta não
|
|
117
|
+
* existe.
|
|
118
|
+
*/
|
|
119
|
+
changePassword(accountId: string, newPassword: string): Promise<boolean>;
|
|
120
|
+
/**
|
|
121
|
+
* Inicia a troca de e-mail: gera um token de confirmação para o `newEmail` e o
|
|
122
|
+
* persiste. Retorna o token + a conta, ou null se a conta não existe OU se o
|
|
123
|
+
* `newEmail` já pertence a outra conta.
|
|
124
|
+
*/
|
|
125
|
+
requestEmailChange(accountId: string, newEmail: string): Promise<{
|
|
126
|
+
token: string;
|
|
127
|
+
account: AuthAccount;
|
|
128
|
+
newEmail: string;
|
|
129
|
+
} | null>;
|
|
130
|
+
/**
|
|
131
|
+
* Confirma a troca de e-mail consumindo o token (single-use). Em caso de
|
|
132
|
+
* sucesso aplica o novo e-mail, marca-o como verificado e limpa o token.
|
|
133
|
+
* Retorna `{ ok: true, account, oldEmail, newEmail }` ou `{ ok: false }`.
|
|
134
|
+
* `oldEmail` é o e-mail da conta ANTES da troca (para avisos de segurança ao
|
|
135
|
+
* endereço antigo e auditoria). `account.email` já reflete o novo endereço.
|
|
136
|
+
*/
|
|
137
|
+
confirmEmailChange(token: string): Promise<{
|
|
138
|
+
ok: true;
|
|
139
|
+
account: AuthAccount;
|
|
140
|
+
oldEmail: string;
|
|
141
|
+
newEmail: string;
|
|
142
|
+
} | {
|
|
143
|
+
ok: false;
|
|
144
|
+
}>;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Status da conta (habilitar/desabilitar) — usado pelo console admin para
|
|
148
|
+
* suspender uma conta sem apagá-la. É uma CAPACIDADE opcional: stores sem suporte
|
|
149
|
+
* omitem os métodos e a UI esconde os botões de disable/enable. Quando suportada,
|
|
150
|
+
* os fluxos de login (interaction OIDC + console de conta) DEVEM rejeitar contas
|
|
151
|
+
* desabilitadas (ver `attemptPasswordLogin`).
|
|
152
|
+
*
|
|
153
|
+
* O store default (Lucid) implementa via uma coluna `disabled_at` (timestamp
|
|
154
|
+
* nullable) NO model — quando a coluna existe (probe em `$columnsDefinitions`); se
|
|
155
|
+
* o model não a tiver, a capacidade fica genuinamente ausente (nenhum método é
|
|
156
|
+
* montado) e a UI esconde os botões. Hosts adicionam a coluna por migração própria
|
|
157
|
+
* (mesmo padrão documentado das demais colunas opcionais).
|
|
158
|
+
*/
|
|
159
|
+
export interface AccountStatusCapability {
|
|
160
|
+
/** Desabilita a conta (impede login). No-op se a conta não existe. */
|
|
161
|
+
disableAccount(accountId: string): Promise<void>;
|
|
162
|
+
/** Reabilita a conta. No-op se a conta não existe. */
|
|
163
|
+
enableAccount(accountId: string): Promise<void>;
|
|
164
|
+
/** Indica se a conta está desabilitada (false se a conta não existe). */
|
|
165
|
+
isDisabled(accountId: string): Promise<boolean>;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Edição do perfil próprio (console de conta): nome e avatar. CAPACIDADE opcional;
|
|
169
|
+
* stores sem suporte omitem o método e a UI esconde a seção. O store default
|
|
170
|
+
* (Lucid) grava nas colunas `full_name`/`avatar_url` do model — apenas as que
|
|
171
|
+
* existirem (probe em `$columnsDefinitions`).
|
|
172
|
+
*/
|
|
173
|
+
export interface ProfileCapability {
|
|
174
|
+
/**
|
|
175
|
+
* Atualiza o perfil da conta. Campos `undefined` são deixados como estão;
|
|
176
|
+
* `null` limpa o valor. Retorna a conta atualizada ou null se inexistente.
|
|
177
|
+
*/
|
|
178
|
+
updateProfile(accountId: string, patch: {
|
|
179
|
+
name?: string | null;
|
|
180
|
+
avatarUrl?: string | null;
|
|
181
|
+
}): Promise<AuthAccount | null>;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Account linking por identidade de provider (Google, GitHub, …).
|
|
185
|
+
* `(provider, providerUserId)` é a chave estável vinda do provider OAuth — não
|
|
186
|
+
* depende do e-mail (que pode mudar / não estar presente). Uma conta pode ter
|
|
187
|
+
* várias identidades. Stores sem suporte simplesmente NÃO expõem estes métodos
|
|
188
|
+
* (a capacidade fica ausente) — não há fallback que lança.
|
|
189
|
+
*/
|
|
190
|
+
export interface ProviderIdentityCapability {
|
|
191
|
+
/** Acha a conta ligada a uma identidade de provider; null se desconhecida. */
|
|
192
|
+
findByProviderIdentity(provider: string, providerUserId: string): Promise<AuthAccount | null>;
|
|
193
|
+
/** Liga (upsert idempotente na chave única) uma identidade de provider a uma conta. */
|
|
194
|
+
linkProviderIdentity(data: LinkProviderIdentityInput): Promise<void>;
|
|
195
|
+
/**
|
|
196
|
+
* Remove TODAS as identidades de provider ligadas a uma conta (usado na deleção
|
|
197
|
+
* de conta — LGPD). Retorna quantas foram removidas. No-op (0) se a conta não tem
|
|
198
|
+
* identidades.
|
|
199
|
+
*/
|
|
200
|
+
unlinkAllProviderIdentities(accountId: string): Promise<number>;
|
|
201
|
+
/**
|
|
202
|
+
* Lista as identidades de provider de uma conta (usado no export de dados —
|
|
203
|
+
* LGPD). NUNCA expõe tokens/segredos do provider — só provider + providerUserId +
|
|
204
|
+
* email (quando presente).
|
|
205
|
+
*/
|
|
206
|
+
listProviderIdentities(accountId: string): Promise<ProviderIdentitySummary[]>;
|
|
207
|
+
}
|
|
208
|
+
/** Resumo de uma identidade de provider para export/exibição (sem tokens). */
|
|
209
|
+
export interface ProviderIdentitySummary {
|
|
210
|
+
provider: string;
|
|
211
|
+
providerUserId: string;
|
|
212
|
+
email?: string | null;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* MFA / TOTP. Stores sem suporte a MFA omitem a capacidade inteira; o interaction
|
|
216
|
+
* flow trata a ausência como "MFA desligado".
|
|
217
|
+
*/
|
|
218
|
+
export interface MfaCapability {
|
|
219
|
+
/**
|
|
220
|
+
* Estado do MFA da conta (se o desafio TOTP deve ser exigido no login).
|
|
221
|
+
* `enabledAt` (epoch ms) é o instante em que o MFA foi (re)enrolado, usado pelo
|
|
222
|
+
* mecanismo de "trusted devices": um cookie de confiança emitido ANTES desse
|
|
223
|
+
* instante é considerado inválido (re-enrolar MFA revoga a confiança). Pode ser
|
|
224
|
+
* `null`/ausente quando o MFA não está ativo ou o store não rastreia o instante.
|
|
225
|
+
*/
|
|
226
|
+
getMfaState(accountId: string): Promise<{
|
|
227
|
+
enabled: boolean;
|
|
228
|
+
enabledAt?: number | null;
|
|
229
|
+
}>;
|
|
230
|
+
/**
|
|
231
|
+
* Inicia o enrollment TOTP: gera um segredo PENDENTE (mfaEnabledAt continua
|
|
232
|
+
* null) e devolve o segredo + otpauth URI (keyuri). Não ativa o MFA ainda.
|
|
233
|
+
*/
|
|
234
|
+
startTotpEnrollment(accountId: string): Promise<{
|
|
235
|
+
secret: string;
|
|
236
|
+
otpauthUri: string;
|
|
237
|
+
} | null>;
|
|
238
|
+
/**
|
|
239
|
+
* Confirma o enrollment: verifica o código contra o segredo pendente; em caso
|
|
240
|
+
* de sucesso ativa o MFA, gera N recovery codes e devolve os códigos em claro
|
|
241
|
+
* (uma única vez).
|
|
242
|
+
*/
|
|
243
|
+
confirmTotpEnrollment(accountId: string, code: string): Promise<{
|
|
244
|
+
ok: boolean;
|
|
245
|
+
recoveryCodes?: string[];
|
|
246
|
+
}>;
|
|
247
|
+
/** Verifica um código TOTP contra o segredo ativo. */
|
|
248
|
+
verifyTotp(accountId: string, code: string): Promise<boolean>;
|
|
249
|
+
/** Consome (single-use) um recovery code; true se casou e foi removido. */
|
|
250
|
+
consumeRecoveryCode(accountId: string, code: string): Promise<boolean>;
|
|
251
|
+
/** Desliga o MFA: limpa segredo + mfaEnabledAt + recovery codes. */
|
|
252
|
+
disableMfa(accountId: string): Promise<void>;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* MFA / WebAuthn (passkeys) — 2º fator alternativo ao TOTP. Como o TOTP, é uma
|
|
256
|
+
* capacidade INTEIRA opcional: stores sem suporte a passkeys não a expõem e a UI
|
|
257
|
+
* esconde a seção de passkeys. O `expectedChallenge` é gerado no begin
|
|
258
|
+
* (generate*Options) e DEVE ser guardado pelo controller (na sessão) para ser
|
|
259
|
+
* passado de volta no finish (verify*) — o store não mantém estado de desafio
|
|
260
|
+
* entre as chamadas.
|
|
261
|
+
*/
|
|
262
|
+
export interface WebauthnCapability {
|
|
263
|
+
/**
|
|
264
|
+
* Inicia o registro de uma passkey: gera as opções de criação
|
|
265
|
+
* (`generateRegistrationOptions`) escopadas à conta (e excluindo credenciais já
|
|
266
|
+
* registradas). Devolve as opções JSON (o controller serializa pro browser) e o
|
|
267
|
+
* `challenge` (base64url) para guardar na sessão. null = conta inexistente.
|
|
268
|
+
*/
|
|
269
|
+
generatePasskeyRegistrationOptions(accountId: string): Promise<{
|
|
270
|
+
options: Record<string, unknown>;
|
|
271
|
+
challenge: string;
|
|
272
|
+
} | null>;
|
|
273
|
+
/**
|
|
274
|
+
* Finaliza o registro: verifica a resposta do browser
|
|
275
|
+
* (`verifyRegistrationResponse`) contra o `expectedChallenge` guardado. Em caso
|
|
276
|
+
* de sucesso persiste a credencial (id, publicKey, counter, transports) e
|
|
277
|
+
* habilita o MFA. Retorna true se registrou.
|
|
278
|
+
*/
|
|
279
|
+
verifyPasskeyRegistration(accountId: string, response: unknown, expectedChallenge: string): Promise<boolean>;
|
|
280
|
+
/**
|
|
281
|
+
* Inicia a autenticação por passkey no login: gera as opções
|
|
282
|
+
* (`generateAuthenticationOptions`) restritas às credenciais da conta. Devolve
|
|
283
|
+
* as opções JSON + o `challenge` para guardar na sessão. null = conta sem passkeys.
|
|
284
|
+
*/
|
|
285
|
+
generatePasskeyAuthenticationOptions(accountId: string): Promise<{
|
|
286
|
+
options: Record<string, unknown>;
|
|
287
|
+
challenge: string;
|
|
288
|
+
} | null>;
|
|
289
|
+
/**
|
|
290
|
+
* Verifica a resposta de autenticação por passkey
|
|
291
|
+
* (`verifyAuthenticationResponse`) contra o `expectedChallenge` guardado. Em
|
|
292
|
+
* caso de sucesso atualiza o signature counter armazenado. Retorna true se válido.
|
|
293
|
+
*/
|
|
294
|
+
verifyPasskeyAuthentication(accountId: string, response: unknown, expectedChallenge: string): Promise<boolean>;
|
|
295
|
+
/** Lista as passkeys da conta (sem expor chave pública / counter). */
|
|
296
|
+
listPasskeys(accountId: string): Promise<PasskeySummary[]>;
|
|
297
|
+
/** Remove uma passkey (por credential id) da conta. */
|
|
298
|
+
removePasskey(accountId: string, credentialId: string): Promise<void>;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Verificação de e-mail como ESTADO consultável da conta. CAPACIDADE opcional:
|
|
302
|
+
* stores sem a noção de "e-mail verificado" (ex.: model sem a coluna
|
|
303
|
+
* `email_verified_at`) NÃO expõem o método — e features que dependem dela
|
|
304
|
+
* (`requireVerifiedEmail`) degradam graciosamente (não bloqueiam ninguém) e o
|
|
305
|
+
* doctor avisa. Distinta de {@link CoreAccountStore.consumeEmailVerificationToken},
|
|
306
|
+
* que ESCREVE o estado; aqui só LEMOS.
|
|
307
|
+
*/
|
|
308
|
+
export interface EmailVerificationStatusCapability {
|
|
309
|
+
/** True se o e-mail da conta está verificado. False se a conta não existe. */
|
|
310
|
+
isEmailVerified(accountId: string): Promise<boolean>;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Deleção self-service / por admin da conta (LGPD/GDPR — "direito ao
|
|
314
|
+
* esquecimento"). CAPACIDADE opcional: stores sem suporte a delete NÃO expõem o
|
|
315
|
+
* método — a UI esconde a "danger zone" e o admin/REST respondem 409. Apenas
|
|
316
|
+
* apaga a LINHA da conta; o cascade dos demais artefatos (sessões, grants, PATs,
|
|
317
|
+
* passkeys, identidades, MFA, avatar) e a anonimização do audit ficam a cargo do
|
|
318
|
+
* `accountDeletionService` (orquestrador no host).
|
|
319
|
+
*/
|
|
320
|
+
export interface AccountDeletionCapability {
|
|
321
|
+
/** Apaga a linha da conta. Retorna false se a conta não existe. */
|
|
322
|
+
deleteAccount(accountId: string): Promise<boolean>;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Histórico de senhas (disallow_password_reuse). CAPACIDADE opcional, presente
|
|
326
|
+
* quando a tabela `auth_password_history` existe (capability-probed). Grava o
|
|
327
|
+
* hash ANTERIOR a cada troca e rejeita reutilização dos últimos N hashes.
|
|
328
|
+
*
|
|
329
|
+
* Tabela mínima: `id UUID/SERIAL PK, account_id TEXT NOT NULL, password_hash TEXT NOT NULL, created_at TIMESTAMP NOT NULL`.
|
|
330
|
+
*/
|
|
331
|
+
export interface PasswordHistoryCapability {
|
|
332
|
+
/**
|
|
333
|
+
* Verifica se a senha em claro já foi usada recentemente (últimos `count` hashes).
|
|
334
|
+
* Retorna true se é REUTILIZAÇÃO (deve ser rejeitada).
|
|
335
|
+
*
|
|
336
|
+
* @param nativeVerify - função de verificação do model (opcional: quando omitida
|
|
337
|
+
* ou null, o store usa seu próprio hook interno configurado via `nativeVerifyHash`
|
|
338
|
+
* do contexto Lucid). Mantido para extensibilidade.
|
|
339
|
+
*/
|
|
340
|
+
isPasswordReused(accountId: string, plainPassword: string, count: number, nativeVerify?: ((hashed: string, plain: string) => Promise<boolean>) | null): Promise<boolean>;
|
|
341
|
+
/**
|
|
342
|
+
* Grava o hash ATUAL antes de substituí-lo (chamado ANTES de `changePassword`
|
|
343
|
+
* ou equivalente). Best-effort: falha silenciosa não impede a troca.
|
|
344
|
+
*/
|
|
345
|
+
recordPasswordHistory(accountId: string, oldHash: string): Promise<void>;
|
|
346
|
+
/**
|
|
347
|
+
* Remove entradas de histórico além dos últimos `count` por conta. Best-effort.
|
|
348
|
+
*/
|
|
349
|
+
prunePasswordHistory(accountId: string, count: number): Promise<void>;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Expiração de senha. CAPACIDADE opcional, presente quando a coluna
|
|
353
|
+
* `password_changed_at` existe no model de auth_users (capability-probed).
|
|
354
|
+
* Atualiza o timestamp em toda troca/criação de senha.
|
|
355
|
+
*/
|
|
356
|
+
export interface PasswordExpirationCapability {
|
|
357
|
+
/**
|
|
358
|
+
* Retorna o timestamp da última troca de senha, ou null se nunca foi definida
|
|
359
|
+
* (conta legacy sem a coluna / coluna NULL).
|
|
360
|
+
*/
|
|
361
|
+
getPasswordChangedAt(accountId: string): Promise<Date | null>;
|
|
362
|
+
/**
|
|
363
|
+
* Atualiza a coluna `password_changed_at` para o momento atual. Chamado após
|
|
364
|
+
* toda troca/criação de senha. Best-effort: falha não impede a operação.
|
|
365
|
+
*/
|
|
366
|
+
touchPasswordChangedAt(accountId: string): Promise<void>;
|
|
367
|
+
}
|
|
368
|
+
/** Entrada do import de uma conta (comando `authkit:users:import`). */
|
|
369
|
+
export interface ImportAccountInput {
|
|
370
|
+
email: string;
|
|
371
|
+
/**
|
|
372
|
+
* Hash de senha JÁ pronto, vindo do sistema de origem (qualquer formato:
|
|
373
|
+
* bcrypt `$2y$`, scrypt, pbkdf2, etc.). Inserido COMO ESTÁ — sem re-hash. O
|
|
374
|
+
* lazy rehash no primeiro login transparente cuida da migração. Mutuamente
|
|
375
|
+
* exclusivo com nada: se ausente, a conta nasce sem senha utilizável (até um
|
|
376
|
+
* reset). NÃO passa pela política de senha (dado legado/confiável).
|
|
377
|
+
*/
|
|
378
|
+
passwordHash?: string | null;
|
|
379
|
+
fullName?: string | null;
|
|
380
|
+
globalRoles?: string[];
|
|
381
|
+
emailVerified?: boolean;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Import em massa de contas (comando `authkit:users:import`). CAPACIDADE
|
|
385
|
+
* opcional, presente no store Lucid default. Distinta de
|
|
386
|
+
* {@link CoreAccountStore.create}: NÃO re-hasheia o `passwordHash` (insere como
|
|
387
|
+
* está, para migração lazy) e NÃO aplica a política de senha.
|
|
388
|
+
*/
|
|
389
|
+
export interface AccountImportCapability {
|
|
390
|
+
/**
|
|
391
|
+
* Insere uma conta com o hash de senha já pronto (sem re-hash, sem política).
|
|
392
|
+
* Retorna a conta criada, ou null se o e-mail já existe (skip).
|
|
393
|
+
*/
|
|
394
|
+
importAccount(input: ImportAccountInput): Promise<AuthAccount | null>;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Login sem senha por "magic link" — um token de uso único e curta duração
|
|
398
|
+
* enviado por e-mail. CAPACIDADE opcional: stores sem suporte omitem os métodos e
|
|
399
|
+
* a UI esconde o botão "me envie um link".
|
|
400
|
+
*
|
|
401
|
+
* O store default (Lucid) reaproveita as colunas de reset de senha
|
|
402
|
+
* (`passwordResetToken` / `passwordResetExpiresAt`) codificando o token com o
|
|
403
|
+
* prefixo `ml:` — assim NÃO exige migração nova (mesmo padrão do `ec:` da troca de
|
|
404
|
+
* e-mail). O tradeoff é que um magic link e um reset de senha pendentes não
|
|
405
|
+
* coexistem (mesma coluna); na prática são fluxos distintos no tempo. Consumir um
|
|
406
|
+
* magic link NÃO altera a senha.
|
|
407
|
+
*/
|
|
408
|
+
export interface MagicLinkCapability {
|
|
409
|
+
/**
|
|
410
|
+
* Emite um magic link para o e-mail. Retorna o token + a conta, ou null se a
|
|
411
|
+
* conta não existe (o controller SEMPRE renderiza "link enviado" para não vazar
|
|
412
|
+
* a existência de contas).
|
|
413
|
+
*/
|
|
414
|
+
issueMagicLinkToken(email: string): Promise<{
|
|
415
|
+
token: string;
|
|
416
|
+
account: AuthAccount;
|
|
417
|
+
} | null>;
|
|
418
|
+
/**
|
|
419
|
+
* Consome (single-use) um magic link. Retorna a conta autenticada ou null se o
|
|
420
|
+
* token é inválido/expirado. NÃO altera a senha.
|
|
421
|
+
*/
|
|
422
|
+
consumeMagicLinkToken(token: string): Promise<AuthAccount | null>;
|
|
423
|
+
}
|
|
424
|
+
/** DTO público de uma organização. */
|
|
425
|
+
export interface OrgSummary {
|
|
426
|
+
id: string;
|
|
427
|
+
name: string;
|
|
428
|
+
slug: string;
|
|
429
|
+
logoUrl?: string | null;
|
|
430
|
+
metadata?: Record<string, unknown> | null;
|
|
431
|
+
createdAt: string;
|
|
432
|
+
}
|
|
433
|
+
/** Membro de uma organização. */
|
|
434
|
+
export interface OrgMember {
|
|
435
|
+
accountId: string;
|
|
436
|
+
email?: string | null;
|
|
437
|
+
role: string;
|
|
438
|
+
joinedAt: string;
|
|
439
|
+
}
|
|
440
|
+
/** Convite pendente de uma organização. */
|
|
441
|
+
export interface OrgInvitation {
|
|
442
|
+
id: string;
|
|
443
|
+
organizationId: string;
|
|
444
|
+
email: string;
|
|
445
|
+
role: string;
|
|
446
|
+
invitedBy: string;
|
|
447
|
+
expiresAt: string;
|
|
448
|
+
acceptedAt?: string | null;
|
|
449
|
+
createdAt: string;
|
|
450
|
+
}
|
|
451
|
+
/** Informações da org ativa de uma conta (para emissão de claims). */
|
|
452
|
+
export interface ActiveOrgInfo {
|
|
453
|
+
orgId: string;
|
|
454
|
+
orgSlug: string;
|
|
455
|
+
orgRole: string;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Capacidade de Organizations (multi-tenancy). CAPACIDADE OPCIONAL: quando as três
|
|
459
|
+
* tabelas (`auth_organizations`, `auth_organization_members`, `auth_organization_invitations`)
|
|
460
|
+
* estão presentes, o store expõe estes métodos; caso contrário fica genuinamente ausente.
|
|
461
|
+
*/
|
|
462
|
+
export interface OrganizationsCapability {
|
|
463
|
+
createOrg(input: {
|
|
464
|
+
name: string;
|
|
465
|
+
slug: string;
|
|
466
|
+
logoUrl?: string | null;
|
|
467
|
+
metadata?: Record<string, unknown> | null;
|
|
468
|
+
ownerAccountId: string;
|
|
469
|
+
}): Promise<OrgSummary>;
|
|
470
|
+
findOrgById(orgId: string): Promise<OrgSummary | null>;
|
|
471
|
+
findOrgBySlug(slug: string): Promise<OrgSummary | null>;
|
|
472
|
+
listOrgsForAccount(accountId: string): Promise<Array<OrgSummary & {
|
|
473
|
+
role: string;
|
|
474
|
+
}>>;
|
|
475
|
+
updateOrg(orgId: string, patch: {
|
|
476
|
+
name?: string;
|
|
477
|
+
logoUrl?: string | null;
|
|
478
|
+
metadata?: Record<string, unknown> | null;
|
|
479
|
+
}): Promise<OrgSummary | null>;
|
|
480
|
+
deleteOrg(orgId: string): Promise<boolean>;
|
|
481
|
+
listOrgMembers(orgId: string): Promise<OrgMember[]>;
|
|
482
|
+
addOrgMember(orgId: string, accountId: string, role: string): Promise<void>;
|
|
483
|
+
removeOrgMember(orgId: string, accountId: string): Promise<{
|
|
484
|
+
ok: boolean;
|
|
485
|
+
reason?: 'not_found' | 'last_owner';
|
|
486
|
+
}>;
|
|
487
|
+
updateOrgMemberRole(orgId: string, accountId: string, newRole: string): Promise<{
|
|
488
|
+
ok: boolean;
|
|
489
|
+
reason?: 'not_found' | 'last_owner';
|
|
490
|
+
}>;
|
|
491
|
+
getOrgMembership(orgId: string, accountId: string): Promise<{
|
|
492
|
+
role: string;
|
|
493
|
+
} | null>;
|
|
494
|
+
createOrgInvitation(input: {
|
|
495
|
+
organizationId: string;
|
|
496
|
+
email: string;
|
|
497
|
+
role: string;
|
|
498
|
+
invitedBy: string;
|
|
499
|
+
ttlHours: number;
|
|
500
|
+
}): Promise<{
|
|
501
|
+
invitation: OrgInvitation;
|
|
502
|
+
token: string;
|
|
503
|
+
}>;
|
|
504
|
+
findInvitationByTokenHash(tokenHash: string): Promise<OrgInvitation | null>;
|
|
505
|
+
listPendingInvitationsForOrg(orgId: string): Promise<OrgInvitation[]>;
|
|
506
|
+
listPendingInvitationsForEmail(email: string): Promise<OrgInvitation[]>;
|
|
507
|
+
acceptInvitation(invitationId: string, accountId: string): Promise<{
|
|
508
|
+
ok: boolean;
|
|
509
|
+
reason?: 'not_found' | 'expired' | 'email_mismatch' | 'already_member';
|
|
510
|
+
}>;
|
|
511
|
+
/**
|
|
512
|
+
* Revoga (deleta) um convite pendente. ESCOPADO POR ORG: o convite só é
|
|
513
|
+
* deletado se pertencer à `organizationId` informada — previne IDOR cross-org
|
|
514
|
+
* onde um owner/admin de outra org revogaria o convite sabendo apenas o id.
|
|
515
|
+
* Retorna `false` quando o convite não existe OU não pertence à org (not-found).
|
|
516
|
+
*/
|
|
517
|
+
revokeInvitation(organizationId: string, invitationId: string): Promise<boolean>;
|
|
518
|
+
/** Remove todas as memberships e convites enviados pela conta. Best-effort. */
|
|
519
|
+
removeAccountFromAllOrgs(accountId: string): Promise<{
|
|
520
|
+
memberships: number;
|
|
521
|
+
invitations: number;
|
|
522
|
+
}>;
|
|
523
|
+
}
|
|
524
|
+
/** Type guard: o store implementa a capacidade de Organizations. */
|
|
525
|
+
export declare function supportsOrganizations(store: AccountStore): store is AccountStore & OrganizationsCapability;
|
|
526
|
+
/**
|
|
527
|
+
* Store de contas usado pela config. É o núcleo SEMPRE presente
|
|
528
|
+
* ({@link CoreAccountStore}) + as capacidades opcionais (MFA, WebAuthn, account
|
|
529
|
+
* linking por provider) marcadas como `Partial` — assim configs/hosts existentes
|
|
530
|
+
* (que referenciam `AccountStore`) compilam sem mudança, e stores que NÃO
|
|
531
|
+
* implementam uma capacidade simplesmente omitem os métodos (em vez de tê-los
|
|
532
|
+
* presentes-mas-lançando). Use os type guards {@link supportsMfa},
|
|
533
|
+
* {@link supportsPasskeys}, {@link supportsProviderIdentity} para estreitar.
|
|
534
|
+
*/
|
|
535
|
+
export type AccountStore = CoreAccountStore & {
|
|
536
|
+
/**
|
|
537
|
+
* Nome da conexão Lucid usada por este store (deriva de `Model.connection` no
|
|
538
|
+
* store default — ver `lucid_account_store.ts`). Quando presente, os call-sites
|
|
539
|
+
* de RuntimeSettings o repassam como `{ connection }` para que o probe da tabela
|
|
540
|
+
* `auth_settings` seja searchPath-aware (auth vivendo numa conexão/schema
|
|
541
|
+
* próprios). Undefined → conexão default (back-compat total). É metadado
|
|
542
|
+
* opcional, não um método de capacidade — por isso `readonly` e fora dos
|
|
543
|
+
* blocos `Partial<...>` de capacidades probáveis.
|
|
544
|
+
*/
|
|
545
|
+
readonly connectionName?: string;
|
|
546
|
+
} & Partial<MfaCapability & WebauthnCapability & ProviderIdentityCapability & AccountSecurityCapability & AccountStatusCapability & ProfileCapability & MagicLinkCapability & EmailVerificationStatusCapability & AccountDeletionCapability & AccountImportCapability & OrganizationsCapability & PasswordHistoryCapability & PasswordExpirationCapability>;
|
|
547
|
+
/** Type guard: o store implementa a capacidade de MFA / TOTP. */
|
|
548
|
+
export declare function supportsMfa(store: AccountStore): store is AccountStore & MfaCapability;
|
|
549
|
+
/**
|
|
550
|
+
* Type guard: o store implementa a contagem eficiente por role global
|
|
551
|
+
* ({@link AdminCapability.countByGlobalRole}). Quando ausente, callers caem no
|
|
552
|
+
* fallback de scan paginado.
|
|
553
|
+
*/
|
|
554
|
+
export declare function supportsCountByGlobalRole(store: AccountStore): store is AccountStore & {
|
|
555
|
+
countByGlobalRole(role: string): Promise<number>;
|
|
556
|
+
};
|
|
557
|
+
/** Type guard: o store implementa a capacidade de passkeys / WebAuthn. */
|
|
558
|
+
export declare function supportsPasskeys(store: AccountStore): store is AccountStore & WebauthnCapability;
|
|
559
|
+
/** Type guard: o store implementa account linking por identidade de provider. */
|
|
560
|
+
export declare function supportsProviderIdentity(store: AccountStore): store is AccountStore & ProviderIdentityCapability;
|
|
561
|
+
/** Type guard: o store implementa o self-service de segurança (senha/e-mail). */
|
|
562
|
+
export declare function supportsAccountSecurity(store: AccountStore): store is AccountStore & AccountSecurityCapability;
|
|
563
|
+
/** Type guard: o store implementa habilitar/desabilitar conta. */
|
|
564
|
+
export declare function supportsAccountStatus(store: AccountStore): store is AccountStore & AccountStatusCapability;
|
|
565
|
+
/** Type guard: o store implementa a edição de perfil (nome/avatar). */
|
|
566
|
+
export declare function supportsProfile(store: AccountStore): store is AccountStore & ProfileCapability;
|
|
567
|
+
/** Type guard: o store implementa login por magic link (passwordless). */
|
|
568
|
+
export declare function supportsMagicLink(store: AccountStore): store is AccountStore & MagicLinkCapability;
|
|
569
|
+
/** Type guard: o store consegue dizer se o e-mail de uma conta está verificado. */
|
|
570
|
+
export declare function supportsEmailVerificationStatus(store: AccountStore): store is AccountStore & EmailVerificationStatusCapability;
|
|
571
|
+
/** Type guard: o store implementa a deleção (hard delete) da conta. */
|
|
572
|
+
export declare function supportsAccountDeletion(store: AccountStore): store is AccountStore & AccountDeletionCapability;
|
|
573
|
+
/** Type guard: o store implementa o import em massa de contas. */
|
|
574
|
+
export declare function supportsAccountImport(store: AccountStore): store is AccountStore & AccountImportCapability;
|
|
575
|
+
/** Type guard: o store implementa histórico de senhas (disallow_password_reuse). */
|
|
576
|
+
export declare function supportsPasswordHistory(store: AccountStore): store is AccountStore & PasswordHistoryCapability;
|
|
577
|
+
/** Type guard: o store implementa expiração de senha (password_changed_at coluna). */
|
|
578
|
+
export declare function supportsPasswordExpiration(store: AccountStore): store is AccountStore & PasswordExpirationCapability;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** Type guard: o store implementa a capacidade de Organizations. */
|
|
2
|
+
export function supportsOrganizations(store) {
|
|
3
|
+
return typeof store.createOrg === 'function';
|
|
4
|
+
}
|
|
5
|
+
/** Type guard: o store implementa a capacidade de MFA / TOTP. */
|
|
6
|
+
export function supportsMfa(store) {
|
|
7
|
+
return typeof store.getMfaState === 'function';
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Type guard: o store implementa a contagem eficiente por role global
|
|
11
|
+
* ({@link AdminCapability.countByGlobalRole}). Quando ausente, callers caem no
|
|
12
|
+
* fallback de scan paginado.
|
|
13
|
+
*/
|
|
14
|
+
export function supportsCountByGlobalRole(store) {
|
|
15
|
+
return typeof store.countByGlobalRole === 'function';
|
|
16
|
+
}
|
|
17
|
+
/** Type guard: o store implementa a capacidade de passkeys / WebAuthn. */
|
|
18
|
+
export function supportsPasskeys(store) {
|
|
19
|
+
return typeof store.listPasskeys === 'function';
|
|
20
|
+
}
|
|
21
|
+
/** Type guard: o store implementa account linking por identidade de provider. */
|
|
22
|
+
export function supportsProviderIdentity(store) {
|
|
23
|
+
return typeof store.findByProviderIdentity === 'function';
|
|
24
|
+
}
|
|
25
|
+
/** Type guard: o store implementa o self-service de segurança (senha/e-mail). */
|
|
26
|
+
export function supportsAccountSecurity(store) {
|
|
27
|
+
return typeof store.changePassword === 'function';
|
|
28
|
+
}
|
|
29
|
+
/** Type guard: o store implementa habilitar/desabilitar conta. */
|
|
30
|
+
export function supportsAccountStatus(store) {
|
|
31
|
+
return typeof store.disableAccount === 'function';
|
|
32
|
+
}
|
|
33
|
+
/** Type guard: o store implementa a edição de perfil (nome/avatar). */
|
|
34
|
+
export function supportsProfile(store) {
|
|
35
|
+
return typeof store.updateProfile === 'function';
|
|
36
|
+
}
|
|
37
|
+
/** Type guard: o store implementa login por magic link (passwordless). */
|
|
38
|
+
export function supportsMagicLink(store) {
|
|
39
|
+
return typeof store.issueMagicLinkToken === 'function';
|
|
40
|
+
}
|
|
41
|
+
/** Type guard: o store consegue dizer se o e-mail de uma conta está verificado. */
|
|
42
|
+
export function supportsEmailVerificationStatus(store) {
|
|
43
|
+
return typeof store.isEmailVerified === 'function';
|
|
44
|
+
}
|
|
45
|
+
/** Type guard: o store implementa a deleção (hard delete) da conta. */
|
|
46
|
+
export function supportsAccountDeletion(store) {
|
|
47
|
+
return typeof store.deleteAccount === 'function';
|
|
48
|
+
}
|
|
49
|
+
/** Type guard: o store implementa o import em massa de contas. */
|
|
50
|
+
export function supportsAccountImport(store) {
|
|
51
|
+
return typeof store.importAccount === 'function';
|
|
52
|
+
}
|
|
53
|
+
/** Type guard: o store implementa histórico de senhas (disallow_password_reuse). */
|
|
54
|
+
export function supportsPasswordHistory(store) {
|
|
55
|
+
return typeof store.isPasswordReused === 'function';
|
|
56
|
+
}
|
|
57
|
+
/** Type guard: o store implementa expiração de senha (password_changed_at coluna). */
|
|
58
|
+
export function supportsPasswordExpiration(store) {
|
|
59
|
+
return typeof store.getPasswordChangedAt === 'function';
|
|
60
|
+
}
|