@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,113 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import { ACCOUNT_SESSION_KEY } from '../middleware/account_auth.js';
|
|
3
|
+
import { translate } from '../i18n.js';
|
|
4
|
+
import { attemptPasswordLogin } from '../login_attempt.js';
|
|
5
|
+
import { notifyLoginSuccess } from '../login_notify.js';
|
|
6
|
+
import { markSudo } from '../sudo_mode.js';
|
|
7
|
+
import { accountHome } from '../account_home.js';
|
|
8
|
+
import { resolveRuntimeSettings } from '../runtime_settings.js';
|
|
9
|
+
/**
|
|
10
|
+
* Valida um valor de `return_to` recebido da query-string ou de um campo hidden.
|
|
11
|
+
*
|
|
12
|
+
* Regras de segurança (anti open-redirect):
|
|
13
|
+
* - Deve ser uma string não-vazia.
|
|
14
|
+
* - Deve começar com `/`.
|
|
15
|
+
* - NÃO pode começar com `//` (esquema-relativo, ex.: `//evil.com`).
|
|
16
|
+
* - NÃO pode conter `://` (URL absoluta com esquema, ex.: `https://evil.com`).
|
|
17
|
+
* - NÃO pode conter `\` (backslash). Browsers normalizam `\`→`/`, então
|
|
18
|
+
* `/\evil.com` vira `//evil.com` (esquema-relativo) → open-redirect. (L9)
|
|
19
|
+
*
|
|
20
|
+
* Retorna o valor validado ou `null` quando inválido/ausente.
|
|
21
|
+
*/
|
|
22
|
+
export function validateReturnTo(value) {
|
|
23
|
+
if (typeof value !== 'string' || !value)
|
|
24
|
+
return null;
|
|
25
|
+
// L9: backslash é tratado como `/` por muitos browsers; `/\evil.com` →
|
|
26
|
+
// `//evil.com`. Rejeitamos qualquer backslash ANTES das demais checagens
|
|
27
|
+
// para não deixar passar variantes ofuscadas (`/\`, `\/`, `\\`).
|
|
28
|
+
if (value.includes('\\'))
|
|
29
|
+
return null;
|
|
30
|
+
if (!value.startsWith('/'))
|
|
31
|
+
return null;
|
|
32
|
+
if (value.startsWith('//'))
|
|
33
|
+
return null;
|
|
34
|
+
if (value.includes('://'))
|
|
35
|
+
return null;
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
export default class AccountSessionController {
|
|
39
|
+
async show(ctx) {
|
|
40
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
41
|
+
const cfg = service.config;
|
|
42
|
+
const render = cfg.render;
|
|
43
|
+
if (ctx.session.get(ACCOUNT_SESSION_KEY)) {
|
|
44
|
+
return ctx.response.redirect(accountHome(cfg));
|
|
45
|
+
}
|
|
46
|
+
// Lê e valida o return_to da query-string — descarta valores inválidos (open-redirect).
|
|
47
|
+
const rawReturnTo = ctx.request.qs?.()?.return_to ?? ctx.request.input?.('return_to');
|
|
48
|
+
const returnTo = validateReturnTo(rawReturnTo);
|
|
49
|
+
return render(ctx, 'account/login', { csrfToken: ctx.request.csrfToken, returnTo });
|
|
50
|
+
}
|
|
51
|
+
async login(ctx) {
|
|
52
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
53
|
+
const cfg = service.config;
|
|
54
|
+
const render = cfg.render;
|
|
55
|
+
const { email: rawEmail, password } = ctx.request.only(['email', 'password']);
|
|
56
|
+
// L6: normaliza o e-mail (trim + lowercase) ANTES de usar — garante que o
|
|
57
|
+
// lookup, o lockout (keyed por email) e a auditoria usem a forma canônica,
|
|
58
|
+
// independente do casing/espaços digitados.
|
|
59
|
+
const email = typeof rawEmail === 'string' ? rawEmail.trim().toLowerCase() : rawEmail;
|
|
60
|
+
const ip = ctx.request.ip?.() ?? null;
|
|
61
|
+
// Lê e valida o return_to do corpo do formulário (hidden input) — nunca confiar sem revalidar.
|
|
62
|
+
const rawReturnTo = ctx.request.input?.('return_to');
|
|
63
|
+
const returnTo = validateReturnTo(rawReturnTo);
|
|
64
|
+
// Verificação + lockout + auditoria de falha centralizados (sem clientId no console).
|
|
65
|
+
// M1: passa `settings` p/ o lockout (e verified-email/expiração) runtime valerem aqui também.
|
|
66
|
+
const settings = await resolveRuntimeSettings(ctx);
|
|
67
|
+
const result = await attemptPasswordLogin(cfg, {
|
|
68
|
+
email,
|
|
69
|
+
password,
|
|
70
|
+
ip,
|
|
71
|
+
logger: ctx.logger,
|
|
72
|
+
settings: settings ?? undefined,
|
|
73
|
+
});
|
|
74
|
+
if (!result.ok) {
|
|
75
|
+
return render(ctx, 'account/login', {
|
|
76
|
+
csrfToken: ctx.request.csrfToken,
|
|
77
|
+
returnTo,
|
|
78
|
+
error: result.locked
|
|
79
|
+
? translate(cfg.messages, 'errors.account_locked', {
|
|
80
|
+
seconds: result.retryAfterSec ?? 0,
|
|
81
|
+
})
|
|
82
|
+
: result.disabled
|
|
83
|
+
? translate(cfg.messages, 'errors.account_disabled')
|
|
84
|
+
: translate(cfg.messages, 'errors.invalid_credentials'),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const acc = result.account;
|
|
88
|
+
// M5 (session fixation): regenera a sessão IMEDIATAMENTE após autenticar e
|
|
89
|
+
// ANTES de gravar a chave de conta. A elevação de privilégio (anônimo →
|
|
90
|
+
// autenticado) DEVE trocar o session id para que um id fixado por um atacante
|
|
91
|
+
// pré-login deixe de valer. O AdonisJS migra os dados já presentes na sessão
|
|
92
|
+
// para o novo id, então qualquer estado de pré-login (ex.: MFA-pending) é
|
|
93
|
+
// preservado — o que muda é só o identificador do cookie.
|
|
94
|
+
await ctx.session.regenerate();
|
|
95
|
+
ctx.session.put(ACCOUNT_SESSION_KEY, acc.id);
|
|
96
|
+
// Login com senha = confirmação de identidade → marca sudo (graça a partir do login).
|
|
97
|
+
markSudo(ctx);
|
|
98
|
+
await notifyLoginSuccess(ctx, cfg, { accountId: acc.id, email, ip });
|
|
99
|
+
// Redireciona pro destino original (validado), ou cai no accountHome configurado.
|
|
100
|
+
return ctx.response.redirect(returnTo ?? accountHome(cfg));
|
|
101
|
+
}
|
|
102
|
+
async logout(ctx) {
|
|
103
|
+
// M6: não basta `forget(ACCOUNT_SESSION_KEY)` — sobravam na sessão
|
|
104
|
+
// `authkit_sudo_at` (sudo), `authkit_last_seen` e qualquer outro estado
|
|
105
|
+
// sensível, com o session id INALTERADO. Regenerar a sessão troca o id E
|
|
106
|
+
// descarta todos os dados antigos (sudo/last-seen inclusos), destruindo de
|
|
107
|
+
// fato a sessão de privilégio. Mantemos o `forget` explícito por garantia
|
|
108
|
+
// (belt-and-braces) caso o store de sessão não suporte regenerate.
|
|
109
|
+
ctx.session.forget(ACCOUNT_SESSION_KEY);
|
|
110
|
+
await ctx.session.regenerate();
|
|
111
|
+
return ctx.response.redirect('/account/login');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
3
|
+
export default class AccountTokensController {
|
|
4
|
+
index(ctx: HttpContext): Promise<any>;
|
|
5
|
+
store(ctx: HttpContext): Promise<unknown>;
|
|
6
|
+
destroy(ctx: HttpContext): Promise<unknown>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import { ACCOUNT_SESSION_KEY } from '../middleware/account_auth.js';
|
|
3
|
+
import { resolveRuntimeSettings } from '../runtime_settings.js';
|
|
4
|
+
import { requireSudo } from '../sudo_mode.js';
|
|
5
|
+
export default class AccountTokensController {
|
|
6
|
+
async index(ctx) {
|
|
7
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
8
|
+
const cfg = service.config;
|
|
9
|
+
const render = cfg.render;
|
|
10
|
+
const userId = ctx.session.get(ACCOUNT_SESSION_KEY);
|
|
11
|
+
const tokens = await cfg.patStore.listForAccount(userId);
|
|
12
|
+
const createdToken = ctx.session.flashMessages.get('createdToken');
|
|
13
|
+
return render(ctx, 'account/tokens', {
|
|
14
|
+
csrfToken: ctx.request.csrfToken,
|
|
15
|
+
createdToken: createdToken ?? null,
|
|
16
|
+
tokens: tokens.map((t) => ({
|
|
17
|
+
id: t.id,
|
|
18
|
+
name: t.name,
|
|
19
|
+
scopes: t.scopes,
|
|
20
|
+
audience: t.audience,
|
|
21
|
+
lastUsedAt: t.lastUsedAt,
|
|
22
|
+
createdAt: t.createdAt,
|
|
23
|
+
})),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async store(ctx) {
|
|
27
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
28
|
+
const cfg = service.config;
|
|
29
|
+
const userId = ctx.session.get(ACCOUNT_SESSION_KEY);
|
|
30
|
+
// Sudo mode gate.
|
|
31
|
+
const sudoSettingsPat = await resolveRuntimeSettings(ctx);
|
|
32
|
+
const sudoResultPat = await requireSudo(ctx, sudoSettingsPat);
|
|
33
|
+
if (sudoResultPat !== true)
|
|
34
|
+
return sudoResultPat;
|
|
35
|
+
const { name } = ctx.request.only(['name']);
|
|
36
|
+
const { token, pat } = await cfg.patStore.issue({ accountId: userId, name: name || 'Token' });
|
|
37
|
+
ctx.session.flash('createdToken', token);
|
|
38
|
+
await cfg.audit?.record({
|
|
39
|
+
type: 'pat.issued',
|
|
40
|
+
accountId: userId,
|
|
41
|
+
ip: ctx.request.ip?.() ?? null,
|
|
42
|
+
metadata: { patId: pat.id, name: pat.name },
|
|
43
|
+
});
|
|
44
|
+
return ctx.response.redirect('/account/tokens');
|
|
45
|
+
}
|
|
46
|
+
async destroy(ctx) {
|
|
47
|
+
const service = await ctx.containerResolver.make('authkit.server');
|
|
48
|
+
const cfg = service.config;
|
|
49
|
+
const userId = ctx.session.get(ACCOUNT_SESSION_KEY);
|
|
50
|
+
// Sudo mode gate.
|
|
51
|
+
const sudoSettingsPatRev = await resolveRuntimeSettings(ctx);
|
|
52
|
+
const sudoResultPatRev = await requireSudo(ctx, sudoSettingsPatRev);
|
|
53
|
+
if (sudoResultPatRev !== true)
|
|
54
|
+
return sudoResultPatRev;
|
|
55
|
+
const patId = ctx.request.param('id');
|
|
56
|
+
const revoked = await cfg.patStore.revoke(userId, patId);
|
|
57
|
+
if (revoked) {
|
|
58
|
+
await cfg.audit?.record({
|
|
59
|
+
type: 'pat.revoked',
|
|
60
|
+
accountId: userId,
|
|
61
|
+
ip: ctx.request.ip?.() ?? null,
|
|
62
|
+
metadata: { patId },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return ctx.response.redirect('/account/tokens');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import '../augmentations.js';
|
|
2
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
3
|
+
export default class AuthInteractionController {
|
|
4
|
+
show(ctx: HttpContext): Promise<any>;
|
|
5
|
+
/**
|
|
6
|
+
* POST /auth/interaction/:uid/identifier
|
|
7
|
+
* Step 1: receive email, store in session, redirect to step 2.
|
|
8
|
+
* ENUMERATION-SAFE: always advances regardless of whether the email exists.
|
|
9
|
+
*/
|
|
10
|
+
identifier(ctx: HttpContext): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* POST /auth/interaction/:uid/login
|
|
13
|
+
* Step 2: password submit. Reads email from session (never from form).
|
|
14
|
+
*/
|
|
15
|
+
login(ctx: HttpContext): Promise<any>;
|
|
16
|
+
/**
|
|
17
|
+
* POST /auth/interaction/:uid/mfa
|
|
18
|
+
* 2º fator: lê o accountId pendente da sessão e aceita um código TOTP (`code`)
|
|
19
|
+
* OU um recovery code (`recoveryCode`). Em caso de sucesso finaliza a interaction.
|
|
20
|
+
*/
|
|
21
|
+
mfaVerify(ctx: HttpContext): Promise<any>;
|
|
22
|
+
/**
|
|
23
|
+
* true se o authorize request exige MFA via acr_values (contém o mfaAcr da
|
|
24
|
+
* config de step-up). `acr_values` é a string separada por espaços padrão OIDC.
|
|
25
|
+
*/
|
|
26
|
+
private acrRequiresMfa;
|
|
27
|
+
/**
|
|
28
|
+
* Monta o acr/amr do step-up quando o client solicitou o mfaAcr e um 2º fator
|
|
29
|
+
* foi verificado. `method` é o método do segundo fator (totp/recovery/webauthn).
|
|
30
|
+
* Retorna `undefined` quando não há step-up — completeLogin usa o default.
|
|
31
|
+
*/
|
|
32
|
+
private stepUpExtra;
|
|
33
|
+
/** true se o store suporta passkeys E a conta tem ao menos uma registrada. */
|
|
34
|
+
private hasPasskeys;
|
|
35
|
+
/**
|
|
36
|
+
* Lê o cookie de dispositivo confiável (encriptado, appKey-backed) e valida que
|
|
37
|
+
* pertence a `accountId`, não expirou e é posterior ao último (re)enrollment de
|
|
38
|
+
* MFA. Step-up NÃO chama isto (força sempre o MFA). Best-effort: qualquer erro de
|
|
39
|
+
* leitura → não confiável.
|
|
40
|
+
*/
|
|
41
|
+
private checkTrustedDevice;
|
|
42
|
+
/**
|
|
43
|
+
* Se o checkbox "confiar neste dispositivo" foi marcado E o mecanismo está ligado,
|
|
44
|
+
* grava o cookie encriptado de confiança para a conta (skip MFA por N dias).
|
|
45
|
+
*/
|
|
46
|
+
private maybeTrustDevice;
|
|
47
|
+
/**
|
|
48
|
+
* Emite o e-mail de desbloqueio OTP quando o fator fica travado.
|
|
49
|
+
* Best-effort, fail-safe: nunca lança na request.
|
|
50
|
+
*/
|
|
51
|
+
private sendOtpUnlockEmailIfAble;
|
|
52
|
+
/**
|
|
53
|
+
* accountId para uma cerimônia de passkey no login. Prioriza o accountId pendente
|
|
54
|
+
* do MFA (passkey como 2º fator). Quando ausente e o passkey-first está ligado,
|
|
55
|
+
* resolve a conta pelo e-mail guardado na sessão (passkey ANTES da senha) — só se
|
|
56
|
+
* a conta existe E tem ao menos uma passkey.
|
|
57
|
+
*/
|
|
58
|
+
private resolvePasskeyAccountId;
|
|
59
|
+
/**
|
|
60
|
+
* POST /auth/interaction/:uid/magic
|
|
61
|
+
* Magic link: lê o e-mail da sessão (passwordless.magicLink ligado), emite um
|
|
62
|
+
* token de uso único e dispara o e-mail. SEMPRE renderiza "link enviado",
|
|
63
|
+
* independentemente de a conta existir (anti-enumeração). Throttled como o login.
|
|
64
|
+
*/
|
|
65
|
+
magicLinkRequest(ctx: HttpContext): Promise<any>;
|
|
66
|
+
/**
|
|
67
|
+
* GET /auth/interaction/:uid/magic?token=...
|
|
68
|
+
* Consome o magic link. Em sucesso finaliza o login (amr `['email']`). Token
|
|
69
|
+
* inválido/expirado volta ao início do login.
|
|
70
|
+
*/
|
|
71
|
+
magicLinkConsume(ctx: HttpContext): Promise<any>;
|
|
72
|
+
/**
|
|
73
|
+
* POST /auth/interaction/:uid/passkey/options
|
|
74
|
+
*
|
|
75
|
+
* Gera as opções de autenticação por passkey. Suporta dois modos:
|
|
76
|
+
*
|
|
77
|
+
* 1. **Modo normal** (MFA gate ou passkey-first com e-mail na sessão):
|
|
78
|
+
* resolve o `accountId` e gera opções com `allowCredentials` restrito às
|
|
79
|
+
* credenciais da conta (comportamento original).
|
|
80
|
+
*
|
|
81
|
+
* 2. **Modo discoverable** (WebAuthn autofill / conditional mediation):
|
|
82
|
+
* chamado sem accountId resolvível (tela de identifier sem e-mail ainda).
|
|
83
|
+
* Neste caso, delega a `generatePasskeyAuthenticationOptions` com accountId
|
|
84
|
+
* especial `'__discoverable__'` — o store deve retornar opções com
|
|
85
|
+
* `allowCredentials: []` (deixa o browser apresentar TODAS as passkeys
|
|
86
|
+
* disponíveis). Quando o store não suporta este modo, devolve 400 com
|
|
87
|
+
* `discoverable: false` (o JS de autofill trata silenciosamente).
|
|
88
|
+
*
|
|
89
|
+
* Guarda o challenge na sessão e devolve as opções JSON.
|
|
90
|
+
*/
|
|
91
|
+
passkeyOptions(ctx: HttpContext): Promise<any>;
|
|
92
|
+
/**
|
|
93
|
+
* POST /auth/interaction/:uid/passkey/verify
|
|
94
|
+
* Verifica a resposta de autenticação por passkey contra o challenge guardado;
|
|
95
|
+
* em caso de sucesso FINALIZA a interaction (303 de volta ao client — alternativa
|
|
96
|
+
* ao código TOTP). É um POST de página inteira (form), não fetch: o browser
|
|
97
|
+
* submete o JSON da assertion no campo `response` e segue o redirect normalmente.
|
|
98
|
+
*/
|
|
99
|
+
passkeyVerify(ctx: HttpContext): Promise<any>;
|
|
100
|
+
/**
|
|
101
|
+
* GET /auth/interaction/:uid/switch
|
|
102
|
+
* Clears the stored email and redirects back to step 1.
|
|
103
|
+
*/
|
|
104
|
+
switchIdentifier(ctx: HttpContext): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* POST /auth/interaction/:uid/password-expired
|
|
107
|
+
*
|
|
108
|
+
* Step de troca obrigatória quando a senha expirou. A senha VELHA já foi
|
|
109
|
+
* verificada em `login` — aqui a conta está no step `password_expired` da
|
|
110
|
+
* sessão. O usuário informa a nova senha (+ confirmação) e o controller:
|
|
111
|
+
* 1. Valida política de senha.
|
|
112
|
+
* 2. Atualiza a senha via `changePassword` (que toca `passwordChangedAt`).
|
|
113
|
+
* 3. Finaliza a interaction normalmente.
|
|
114
|
+
*
|
|
115
|
+
* Capability-probed: sem `changePassword` → redireciona para o login.
|
|
116
|
+
*/
|
|
117
|
+
changeExpiredPassword(ctx: HttpContext): Promise<any>;
|
|
118
|
+
consent(ctx: HttpContext): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* GET /auth/otp-unlock/:token
|
|
121
|
+
* Consome o token de desbloqueio OTP enviado por e-mail. Valida (hash + TTL),
|
|
122
|
+
* zera o contador/lock, audita `otp.unlocked` e redireciona ao login com mensagem.
|
|
123
|
+
*/
|
|
124
|
+
otpUnlock(ctx: HttpContext): Promise<any>;
|
|
125
|
+
}
|