@dudousxd/adonis-authkit-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -0
  3. package/build/assets/grafana/authkit-dashboard.json +118 -0
  4. package/build/commands/commands.json +30 -0
  5. package/build/commands/configure.d.ts +2 -0
  6. package/build/commands/configure.js +42 -0
  7. package/build/commands/eject.d.ts +11 -0
  8. package/build/commands/eject.js +96 -0
  9. package/build/commands/main.d.ts +12 -0
  10. package/build/commands/main.js +38 -0
  11. package/build/commands/ui_preset.d.ts +4 -0
  12. package/build/commands/ui_preset.js +32 -0
  13. package/build/database/migrations/make_authkit_oidc_table.d.ts +6 -0
  14. package/build/database/migrations/make_authkit_oidc_table.js +19 -0
  15. package/build/host/views/account/login.edge +29 -0
  16. package/build/host/views/account/mfa.edge +151 -0
  17. package/build/host/views/account/tokens.edge +70 -0
  18. package/build/host/views/admin/audit.edge +72 -0
  19. package/build/host/views/admin/clients.edge +51 -0
  20. package/build/host/views/admin/dashboard.edge +58 -0
  21. package/build/host/views/admin/users.edge +76 -0
  22. package/build/host/views/consent.edge +19 -0
  23. package/build/host/views/forgot.edge +30 -0
  24. package/build/host/views/login.edge +91 -0
  25. package/build/host/views/mfa-challenge.edge +88 -0
  26. package/build/host/views/reset.edge +29 -0
  27. package/build/host/views/signup.edge +44 -0
  28. package/build/host/views/verify-email.edge +16 -0
  29. package/build/index.d.ts +42 -0
  30. package/build/index.js +28 -0
  31. package/build/providers/authkit_server_provider.d.ts +19 -0
  32. package/build/providers/authkit_server_provider.js +81 -0
  33. package/build/src/accounts/account_store.d.ts +136 -0
  34. package/build/src/accounts/account_store.js +1 -0
  35. package/build/src/accounts/lucid_account_store.d.ts +75 -0
  36. package/build/src/accounts/lucid_account_store.js +396 -0
  37. package/build/src/adapters/adapter_contract.d.ts +18 -0
  38. package/build/src/adapters/adapter_contract.js +1 -0
  39. package/build/src/adapters/database_adapter.d.ts +15 -0
  40. package/build/src/adapters/database_adapter.js +63 -0
  41. package/build/src/adapters/factory.d.ts +30 -0
  42. package/build/src/adapters/factory.js +43 -0
  43. package/build/src/adapters/redis_adapter.d.ts +16 -0
  44. package/build/src/adapters/redis_adapter.js +95 -0
  45. package/build/src/audit/audit_sink.d.ts +54 -0
  46. package/build/src/audit/audit_sink.js +1 -0
  47. package/build/src/audit/lucid_audit_sink.d.ts +10 -0
  48. package/build/src/audit/lucid_audit_sink.js +60 -0
  49. package/build/src/controllers/oidc_callback_controller.d.ts +22 -0
  50. package/build/src/controllers/oidc_callback_controller.js +33 -0
  51. package/build/src/define_config.d.ts +261 -0
  52. package/build/src/define_config.js +115 -0
  53. package/build/src/host/account_lockout.d.ts +86 -0
  54. package/build/src/host/account_lockout.js +185 -0
  55. package/build/src/host/augmentations.d.ts +1 -0
  56. package/build/src/host/augmentations.js +1 -0
  57. package/build/src/host/branding.d.ts +17 -0
  58. package/build/src/host/branding.js +8 -0
  59. package/build/src/host/controllers/account_mfa_controller.d.ts +30 -0
  60. package/build/src/host/controllers/account_mfa_controller.js +157 -0
  61. package/build/src/host/controllers/account_session_controller.d.ts +7 -0
  62. package/build/src/host/controllers/account_session_controller.js +50 -0
  63. package/build/src/host/controllers/account_tokens_controller.d.ts +7 -0
  64. package/build/src/host/controllers/account_tokens_controller.js +55 -0
  65. package/build/src/host/controllers/admin/admin_audit_controller.d.ts +10 -0
  66. package/build/src/host/controllers/admin/admin_audit_controller.js +56 -0
  67. package/build/src/host/controllers/admin/admin_clients_controller.d.ts +10 -0
  68. package/build/src/host/controllers/admin/admin_clients_controller.js +24 -0
  69. package/build/src/host/controllers/admin/admin_dashboard_controller.d.ts +10 -0
  70. package/build/src/host/controllers/admin/admin_dashboard_controller.js +27 -0
  71. package/build/src/host/controllers/admin/admin_users_controller.d.ts +11 -0
  72. package/build/src/host/controllers/admin/admin_users_controller.js +53 -0
  73. package/build/src/host/controllers/interaction_controller.d.ts +44 -0
  74. package/build/src/host/controllers/interaction_controller.js +304 -0
  75. package/build/src/host/controllers/pat_introspection_controller.d.ts +22 -0
  76. package/build/src/host/controllers/pat_introspection_controller.js +46 -0
  77. package/build/src/host/controllers/registration_controller.d.ts +18 -0
  78. package/build/src/host/controllers/registration_controller.js +169 -0
  79. package/build/src/host/controllers/social_controller.d.ts +8 -0
  80. package/build/src/host/controllers/social_controller.js +82 -0
  81. package/build/src/host/default_mailer.d.ts +39 -0
  82. package/build/src/host/default_mailer.js +141 -0
  83. package/build/src/host/email_templates.d.ts +35 -0
  84. package/build/src/host/email_templates.js +66 -0
  85. package/build/src/host/i18n.d.ts +178 -0
  86. package/build/src/host/i18n.js +208 -0
  87. package/build/src/host/middleware/account_auth.d.ts +7 -0
  88. package/build/src/host/middleware/account_auth.js +11 -0
  89. package/build/src/host/rate_limit.d.ts +32 -0
  90. package/build/src/host/rate_limit.js +87 -0
  91. package/build/src/host/register_auth_host.d.ts +41 -0
  92. package/build/src/host/register_auth_host.js +133 -0
  93. package/build/src/host/renderers/edge_renderer.d.ts +3 -0
  94. package/build/src/host/renderers/edge_renderer.js +29 -0
  95. package/build/src/host/renderers/inertia_renderer.d.ts +5 -0
  96. package/build/src/host/renderers/inertia_renderer.js +26 -0
  97. package/build/src/host/validators.d.ts +39 -0
  98. package/build/src/host/validators.js +13 -0
  99. package/build/src/keys/jwks_manager.d.ts +6 -0
  100. package/build/src/keys/jwks_manager.js +11 -0
  101. package/build/src/mixins/with_audit_log.d.ts +19 -0
  102. package/build/src/mixins/with_audit_log.js +41 -0
  103. package/build/src/mixins/with_auth_user.d.ts +18 -0
  104. package/build/src/mixins/with_auth_user.js +39 -0
  105. package/build/src/mixins/with_credentials.d.ts +20 -0
  106. package/build/src/mixins/with_credentials.js +29 -0
  107. package/build/src/mixins/with_mfa.d.ts +31 -0
  108. package/build/src/mixins/with_mfa.js +39 -0
  109. package/build/src/mixins/with_personal_access_token.d.ts +19 -0
  110. package/build/src/mixins/with_personal_access_token.js +44 -0
  111. package/build/src/mixins/with_provider_identity.d.ts +20 -0
  112. package/build/src/mixins/with_provider_identity.js +32 -0
  113. package/build/src/mixins/with_webauthn_credential.d.ts +37 -0
  114. package/build/src/mixins/with_webauthn_credential.js +49 -0
  115. package/build/src/observability/metrics_controller.d.ts +5 -0
  116. package/build/src/observability/metrics_controller.js +24 -0
  117. package/build/src/observability/metrics_service.d.ts +2 -0
  118. package/build/src/observability/metrics_service.js +7 -0
  119. package/build/src/observability/otel_recorder.d.ts +10 -0
  120. package/build/src/observability/otel_recorder.js +59 -0
  121. package/build/src/observability/wire_provider_events.d.ts +12 -0
  122. package/build/src/observability/wire_provider_events.js +19 -0
  123. package/build/src/pat/lucid_pat_store.d.ts +6 -0
  124. package/build/src/pat/lucid_pat_store.js +62 -0
  125. package/build/src/pat/pat_store.d.ts +31 -0
  126. package/build/src/pat/pat_store.js +1 -0
  127. package/build/src/pat/pat_tokens.d.ts +4 -0
  128. package/build/src/pat/pat_tokens.js +9 -0
  129. package/build/src/provider/build_provider.d.ts +8 -0
  130. package/build/src/provider/build_provider.js +101 -0
  131. package/build/src/provider/interaction_actions.d.ts +21 -0
  132. package/build/src/provider/interaction_actions.js +32 -0
  133. package/build/src/provider/oidc_service.d.ts +17 -0
  134. package/build/src/provider/oidc_service.js +84 -0
  135. package/build/src/provider/token_exchange.d.ts +15 -0
  136. package/build/src/provider/token_exchange.js +72 -0
  137. package/build/src/register_routes.d.ts +16 -0
  138. package/build/src/register_routes.js +21 -0
  139. package/build/stubs/config/authkit.stub +29 -0
  140. package/build/stubs/main.d.ts +1 -0
  141. package/build/stubs/main.js +2 -0
  142. package/build/stubs/models/auth_user.stub +13 -0
  143. package/build/stubs/ui/edge/views/consent.edge +13 -0
  144. package/build/stubs/ui/edge/views/login.edge +19 -0
  145. package/build/stubs/ui/react/components/auth_shell.tsx +67 -0
  146. package/build/stubs/ui/react/pages/account/login.tsx +56 -0
  147. package/build/stubs/ui/react/pages/account/mfa.tsx +132 -0
  148. package/build/stubs/ui/react/pages/account/tokens.tsx +88 -0
  149. package/build/stubs/ui/react/pages/consent.tsx +39 -0
  150. package/build/stubs/ui/react/pages/forgot.tsx +44 -0
  151. package/build/stubs/ui/react/pages/login.tsx +171 -0
  152. package/build/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
  153. package/build/stubs/ui/react/pages/reset.tsx +58 -0
  154. package/build/stubs/ui/react/pages/signup.tsx +78 -0
  155. package/build/stubs/ui/react/pages/verify-email.tsx +24 -0
  156. package/build/types.d.ts +7 -0
  157. package/build/types.js +1 -0
  158. package/package.json +108 -0
  159. package/stubs/config/authkit.stub +29 -0
  160. package/stubs/main.ts +2 -0
  161. package/stubs/models/auth_user.stub +13 -0
  162. package/stubs/ui/edge/views/consent.edge +13 -0
  163. package/stubs/ui/edge/views/login.edge +19 -0
  164. package/stubs/ui/react/components/auth_shell.tsx +67 -0
  165. package/stubs/ui/react/pages/account/login.tsx +56 -0
  166. package/stubs/ui/react/pages/account/mfa.tsx +132 -0
  167. package/stubs/ui/react/pages/account/tokens.tsx +88 -0
  168. package/stubs/ui/react/pages/consent.tsx +39 -0
  169. package/stubs/ui/react/pages/forgot.tsx +44 -0
  170. package/stubs/ui/react/pages/login.tsx +171 -0
  171. package/stubs/ui/react/pages/mfa-challenge.tsx +72 -0
  172. package/stubs/ui/react/pages/reset.tsx +58 -0
  173. package/stubs/ui/react/pages/signup.tsx +78 -0
  174. package/stubs/ui/react/pages/verify-email.tsx +24 -0
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Internacionalização (i18n) das telas do host-kit.
3
+ *
4
+ * Todas as strings visíveis ao usuário das views Edge (e as mensagens de
5
+ * flash/erro produzidas pelos controllers) vivem num catálogo achatado de
6
+ * chaves pontilhadas. O default embutido é pt-BR — os apps continuam
7
+ * funcionando SEM nenhuma configuração. O host pode sobrescrever chaves
8
+ * pontuais ou fornecer locales inteiros (ex.: `en`) via `I18nConfig`.
9
+ */
10
+ /** Catálogo achatado de chaves de mensagem → strings. */
11
+ export type AuthMessages = Record<string, string>;
12
+ export interface I18nConfig {
13
+ /** Locale ativo. Default: 'pt-BR'. */
14
+ locale?: string;
15
+ /**
16
+ * Locales adicionais e/ou overrides pontuais. As chaves do locale ativo são
17
+ * mescladas SOBRE o default pt-BR — então o host pode trocar só algumas
18
+ * chaves ou trazer um locale novo por completo.
19
+ */
20
+ messages?: Record<string, Partial<AuthMessages>>;
21
+ }
22
+ /** Locale default do host-kit. */
23
+ export declare const DEFAULT_LOCALE = "pt-BR";
24
+ /**
25
+ * Catálogo default (pt-BR) — cobre TODAS as strings visíveis ao usuário das
26
+ * views e as mensagens de flash/erro dos controllers. Chaves agrupadas por tela.
27
+ */
28
+ export declare const DEFAULT_MESSAGES: {
29
+ 'common.app_fallback': string;
30
+ 'common.brand_eyebrow': string;
31
+ 'login.page_title': string;
32
+ 'login.title': string;
33
+ 'login.identifier_intro': string;
34
+ 'login.email_label': string;
35
+ 'login.identifier_submit': string;
36
+ 'login.create_account': string;
37
+ 'login.forgot_password': string;
38
+ 'login.divider_or': string;
39
+ 'login.google': string;
40
+ 'login.greeting': string;
41
+ 'login.switch_account': string;
42
+ 'login.password_label': string;
43
+ 'login.submit': string;
44
+ 'signup.page_title': string;
45
+ 'signup.title': string;
46
+ 'signup.intro': string;
47
+ 'signup.name_label': string;
48
+ 'signup.email_label': string;
49
+ 'signup.password_label': string;
50
+ 'signup.submit': string;
51
+ 'signup.have_account': string;
52
+ 'forgot.page_title': string;
53
+ 'forgot.sent_title': string;
54
+ 'forgot.sent_body': string;
55
+ 'forgot.title': string;
56
+ 'forgot.intro': string;
57
+ 'forgot.email_label': string;
58
+ 'forgot.submit': string;
59
+ 'reset.page_title': string;
60
+ 'reset.done_title': string;
61
+ 'reset.done_body': string;
62
+ 'reset.title': string;
63
+ 'reset.intro': string;
64
+ 'reset.password_label': string;
65
+ 'reset.submit': string;
66
+ 'verify_email.page_title': string;
67
+ 'verify_email.verified_title': string;
68
+ 'verify_email.verified_body': string;
69
+ 'verify_email.invalid_title': string;
70
+ 'verify_email.invalid_body': string;
71
+ 'mfa_challenge.page_title': string;
72
+ 'mfa_challenge.title': string;
73
+ 'mfa_challenge.intro': string;
74
+ 'mfa_challenge.code_label': string;
75
+ 'mfa_challenge.submit': string;
76
+ 'mfa_challenge.recovery_summary': string;
77
+ 'mfa_challenge.recovery_submit': string;
78
+ 'mfa_challenge.passkey_button': string;
79
+ 'mfa_challenge.passkey_error': string;
80
+ 'consent.page_title': string;
81
+ 'consent.title': string;
82
+ 'consent.body': string;
83
+ 'consent.submit': string;
84
+ 'account.login.page_title': string;
85
+ 'account.login.title': string;
86
+ 'account.login.intro': string;
87
+ 'account.login.email_label': string;
88
+ 'account.login.password_label': string;
89
+ 'account.login.submit': string;
90
+ 'account.tokens.page_title': string;
91
+ 'account.tokens.title': string;
92
+ 'account.tokens.logout': string;
93
+ 'account.tokens.created_notice': string;
94
+ 'account.tokens.name_placeholder': string;
95
+ 'account.tokens.create': string;
96
+ 'account.tokens.empty': string;
97
+ 'account.tokens.created_at': string;
98
+ 'account.tokens.last_used': string;
99
+ 'account.tokens.never_used': string;
100
+ 'account.tokens.scopes': string;
101
+ 'account.tokens.audience': string;
102
+ 'account.tokens.revoke': string;
103
+ 'account.mfa.page_title': string;
104
+ 'account.mfa.title': string;
105
+ 'account.mfa.logout': string;
106
+ 'account.mfa.recovery_codes_notice': string;
107
+ 'account.mfa.enroll_intro': string;
108
+ 'account.mfa.qr_alt': string;
109
+ 'account.mfa.manual_intro': string;
110
+ 'account.mfa.confirm_code_label': string;
111
+ 'account.mfa.activate': string;
112
+ 'account.mfa.enabled_html': string;
113
+ 'account.mfa.disable': string;
114
+ 'account.mfa.disabled_intro': string;
115
+ 'account.mfa.enable': string;
116
+ 'mfa.passkey.section_title': string;
117
+ 'mfa.passkey.section_intro': string;
118
+ 'mfa.passkey.add': string;
119
+ 'mfa.passkey.remove': string;
120
+ 'mfa.passkey.empty': string;
121
+ 'mfa.passkey.unnamed': string;
122
+ 'mfa.passkey.created_at': string;
123
+ 'mfa.passkey.register_error': string;
124
+ 'mfa.passkey.unsupported': string;
125
+ 'admin.nav.dashboard': string;
126
+ 'admin.nav.users': string;
127
+ 'admin.nav.clients': string;
128
+ 'admin.nav.audit': string;
129
+ 'admin.nav.logout': string;
130
+ 'admin.dashboard.page_title': string;
131
+ 'admin.dashboard.title': string;
132
+ 'admin.dashboard.users_count': string;
133
+ 'admin.dashboard.clients_count': string;
134
+ 'admin.dashboard.audit_count': string;
135
+ 'admin.dashboard.recent_title': string;
136
+ 'admin.users.page_title': string;
137
+ 'admin.users.title': string;
138
+ 'admin.users.search_placeholder': string;
139
+ 'admin.users.search': string;
140
+ 'admin.users.empty': string;
141
+ 'admin.users.roles_placeholder': string;
142
+ 'admin.users.save_roles': string;
143
+ 'admin.clients.page_title': string;
144
+ 'admin.clients.title': string;
145
+ 'admin.clients.empty': string;
146
+ 'admin.clients.confidential': string;
147
+ 'admin.clients.public': string;
148
+ 'admin.clients.grants': string;
149
+ 'admin.clients.redirect_uris': string;
150
+ 'admin.clients.dynamic_notice': string;
151
+ 'admin.audit.page_title': string;
152
+ 'admin.audit.title': string;
153
+ 'admin.audit.type_placeholder': string;
154
+ 'admin.audit.subject_placeholder': string;
155
+ 'admin.audit.filter': string;
156
+ 'admin.audit.empty': string;
157
+ 'admin.audit.not_supported': string;
158
+ 'admin.pagination.page': string;
159
+ 'admin.pagination.prev': string;
160
+ 'admin.pagination.next': string;
161
+ 'errors.invalid_credentials': string;
162
+ 'errors.invalid_code': string;
163
+ 'errors.email_taken': string;
164
+ 'errors.signup_failed': string;
165
+ 'errors.invalid_or_expired_token': string;
166
+ 'errors.account_locked': string;
167
+ };
168
+ /**
169
+ * Resolve o catálogo ativo: mescla os overrides do locale selecionado SOBRE o
170
+ * default pt-BR. Sem config, retorna os defaults intactos. Chaves omitidas pelo
171
+ * locale escolhido caem no default pt-BR (fallback de cobertura).
172
+ */
173
+ export declare function resolveMessages(i18n?: I18nConfig): AuthMessages;
174
+ /**
175
+ * Retorna a string para `key` (cai na própria `key` quando ausente) com
176
+ * interpolação no estilo `{name}`. Mantém placeholders sem valor intactos.
177
+ */
178
+ export declare function translate(messages: AuthMessages, key: string, params?: Record<string, string | number>): string;
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Internacionalização (i18n) das telas do host-kit.
3
+ *
4
+ * Todas as strings visíveis ao usuário das views Edge (e as mensagens de
5
+ * flash/erro produzidas pelos controllers) vivem num catálogo achatado de
6
+ * chaves pontilhadas. O default embutido é pt-BR — os apps continuam
7
+ * funcionando SEM nenhuma configuração. O host pode sobrescrever chaves
8
+ * pontuais ou fornecer locales inteiros (ex.: `en`) via `I18nConfig`.
9
+ */
10
+ /** Locale default do host-kit. */
11
+ export const DEFAULT_LOCALE = 'pt-BR';
12
+ /**
13
+ * Catálogo default (pt-BR) — cobre TODAS as strings visíveis ao usuário das
14
+ * views e as mensagens de flash/erro dos controllers. Chaves agrupadas por tela.
15
+ */
16
+ export const DEFAULT_MESSAGES = {
17
+ // Comum / fallback de marca.
18
+ 'common.app_fallback': 'Auth',
19
+ 'common.brand_eyebrow': 'Auth',
20
+ // Tela de login (interaction OIDC: identifier + password).
21
+ 'login.page_title': 'Entrar',
22
+ 'login.title': 'Entrar',
23
+ 'login.identifier_intro': 'Informe seu e-mail para continuar.',
24
+ 'login.email_label': 'E-mail',
25
+ 'login.identifier_submit': 'Continuar',
26
+ 'login.create_account': 'Criar conta',
27
+ 'login.forgot_password': 'Esqueci a senha',
28
+ 'login.divider_or': 'ou',
29
+ 'login.google': 'Entrar com Google',
30
+ 'login.greeting': 'Olá, {name}',
31
+ 'login.switch_account': 'Trocar de conta',
32
+ 'login.password_label': 'Senha',
33
+ 'login.submit': 'Entrar',
34
+ // Tela de cadastro (signup).
35
+ 'signup.page_title': 'Criar conta',
36
+ 'signup.title': 'Criar conta',
37
+ 'signup.intro': 'Preencha seus dados para começar.',
38
+ 'signup.name_label': 'Nome',
39
+ 'signup.email_label': 'E-mail',
40
+ 'signup.password_label': 'Senha',
41
+ 'signup.submit': 'Criar conta',
42
+ 'signup.have_account': 'Já tenho conta',
43
+ // Recuperação de senha (forgot).
44
+ 'forgot.page_title': 'Recuperar senha',
45
+ 'forgot.sent_title': 'E-mail enviado',
46
+ 'forgot.sent_body': 'Se o e-mail existir, enviaremos instruções de redefinição.',
47
+ 'forgot.title': 'Recuperar senha',
48
+ 'forgot.intro': 'Enviaremos um link para redefinir sua senha.',
49
+ 'forgot.email_label': 'E-mail',
50
+ 'forgot.submit': 'Enviar link',
51
+ // Redefinição de senha (reset).
52
+ 'reset.page_title': 'Redefinir senha',
53
+ 'reset.done_title': 'Senha redefinida',
54
+ 'reset.done_body': 'Você já pode entrar com a nova senha.',
55
+ 'reset.title': 'Nova senha',
56
+ 'reset.intro': 'Escolha uma nova senha para sua conta.',
57
+ 'reset.password_label': 'Senha',
58
+ 'reset.submit': 'Redefinir',
59
+ // Verificação de e-mail (verify-email).
60
+ 'verify_email.page_title': 'Verificar e-mail',
61
+ 'verify_email.verified_title': 'E-mail verificado',
62
+ 'verify_email.verified_body': 'Seu e-mail foi confirmado com sucesso.',
63
+ 'verify_email.invalid_title': 'Link inválido',
64
+ 'verify_email.invalid_body': 'O link de verificação é inválido ou já foi utilizado.',
65
+ // Desafio de MFA no fluxo de login (mfa-challenge).
66
+ 'mfa_challenge.page_title': 'Verificação em duas etapas',
67
+ 'mfa_challenge.title': 'Verificação em duas etapas',
68
+ 'mfa_challenge.intro': 'Abra seu app autenticador e informe o código de 6 dígitos.',
69
+ 'mfa_challenge.code_label': 'Código',
70
+ 'mfa_challenge.submit': 'Verificar',
71
+ 'mfa_challenge.recovery_summary': 'Usar um código de recuperação',
72
+ 'mfa_challenge.recovery_submit': 'Entrar com código de recuperação',
73
+ 'mfa_challenge.passkey_button': 'Usar passkey',
74
+ 'mfa_challenge.passkey_error': 'Não foi possível autenticar com a passkey. Tente novamente.',
75
+ // Consent (autorização de cliente OIDC).
76
+ 'consent.page_title': 'Autorizar',
77
+ 'consent.title': 'Autorizar acesso',
78
+ // `{app}` é interpolado com o nome do app já envolto em <strong> (renderizado
79
+ // raw na view). O nome vem do branding (config-trusted).
80
+ 'consent.body': 'O app <strong>{app}</strong> quer acessar sua conta.',
81
+ 'consent.submit': 'Autorizar',
82
+ // Console de conta — login (account/login).
83
+ 'account.login.page_title': 'Minha conta',
84
+ 'account.login.title': 'Minha conta',
85
+ 'account.login.intro': 'Gerencie seus tokens de acesso.',
86
+ 'account.login.email_label': 'E-mail',
87
+ 'account.login.password_label': 'Senha',
88
+ 'account.login.submit': 'Entrar',
89
+ // Console de conta — tokens (account/tokens).
90
+ 'account.tokens.page_title': 'Tokens de acesso',
91
+ 'account.tokens.title': 'Tokens de acesso',
92
+ 'account.tokens.logout': 'Sair',
93
+ 'account.tokens.created_notice': 'Token criado — copie agora, não será mostrado de novo:',
94
+ 'account.tokens.name_placeholder': 'Nome do token (ex.: CI deploy)',
95
+ 'account.tokens.create': 'Criar',
96
+ 'account.tokens.empty': 'Nenhum token ainda.',
97
+ 'account.tokens.created_at': 'Criado em {date}',
98
+ 'account.tokens.last_used': '· último uso {date}',
99
+ 'account.tokens.never_used': '· nunca usado',
100
+ 'account.tokens.scopes': 'Escopos: {scopes}',
101
+ 'account.tokens.audience': 'Audiência: {audience}',
102
+ 'account.tokens.revoke': 'Revogar',
103
+ // Console de conta — MFA (account/mfa).
104
+ 'account.mfa.page_title': 'Verificação em duas etapas',
105
+ 'account.mfa.title': 'Verificação em duas etapas',
106
+ 'account.mfa.logout': 'Sair',
107
+ 'account.mfa.recovery_codes_notice': 'Guarde seus códigos de recuperação — eles não serão mostrados de novo:',
108
+ 'account.mfa.enroll_intro': 'Escaneie o QR code com seu app autenticador (Google Authenticator, 1Password, etc.).',
109
+ 'account.mfa.qr_alt': 'QR code TOTP',
110
+ 'account.mfa.manual_intro': 'Ou informe manualmente:',
111
+ 'account.mfa.confirm_code_label': 'Código de confirmação',
112
+ 'account.mfa.activate': 'Ativar verificação em duas etapas',
113
+ 'account.mfa.enabled_html': 'A verificação em duas etapas está <span class="font-semibold text-emerald-700">ativa</span> nesta conta.',
114
+ 'account.mfa.disable': 'Desativar',
115
+ 'account.mfa.disabled_intro': 'A verificação em duas etapas está desativada. Ative-a para proteger sua conta com um app autenticador.',
116
+ 'account.mfa.enable': 'Ativar verificação em duas etapas',
117
+ // Console de conta — passkeys (WebAuthn) na tela de MFA.
118
+ 'mfa.passkey.section_title': 'Passkeys (chaves de acesso)',
119
+ 'mfa.passkey.section_intro': 'Use uma chave de acesso (biometria, PIN do dispositivo ou chave de segurança) como segundo fator, sem precisar digitar códigos.',
120
+ 'mfa.passkey.add': 'Adicionar passkey',
121
+ 'mfa.passkey.remove': 'Remover',
122
+ 'mfa.passkey.empty': 'Nenhuma passkey registrada.',
123
+ 'mfa.passkey.unnamed': 'Passkey',
124
+ 'mfa.passkey.created_at': 'Criada em {date}',
125
+ 'mfa.passkey.register_error': 'Não foi possível registrar a passkey. Tente novamente.',
126
+ 'mfa.passkey.unsupported': 'Seu navegador não suporta passkeys.',
127
+ // Console admin (B6) — navegação compartilhada.
128
+ 'admin.nav.dashboard': 'Painel',
129
+ 'admin.nav.users': 'Usuários',
130
+ 'admin.nav.clients': 'Clients',
131
+ 'admin.nav.audit': 'Auditoria',
132
+ 'admin.nav.logout': 'Sair',
133
+ // Console admin — dashboard.
134
+ 'admin.dashboard.page_title': 'Painel admin',
135
+ 'admin.dashboard.title': 'Painel administrativo',
136
+ 'admin.dashboard.users_count': 'Usuários',
137
+ 'admin.dashboard.clients_count': 'Clients',
138
+ 'admin.dashboard.audit_count': 'Eventos de auditoria',
139
+ 'admin.dashboard.recent_title': 'Eventos recentes',
140
+ // Console admin — usuários.
141
+ 'admin.users.page_title': 'Usuários',
142
+ 'admin.users.title': 'Usuários',
143
+ 'admin.users.search_placeholder': 'Buscar por e-mail',
144
+ 'admin.users.search': 'Buscar',
145
+ 'admin.users.empty': 'Nenhum usuário encontrado.',
146
+ 'admin.users.roles_placeholder': 'Papéis (separados por vírgula)',
147
+ 'admin.users.save_roles': 'Salvar papéis',
148
+ // Console admin — clients.
149
+ 'admin.clients.page_title': 'Clients OAuth',
150
+ 'admin.clients.title': 'Clients OAuth',
151
+ 'admin.clients.empty': 'Nenhum client configurado.',
152
+ 'admin.clients.confidential': 'Confidencial',
153
+ 'admin.clients.public': 'Público',
154
+ 'admin.clients.grants': 'Grants: {grants}',
155
+ 'admin.clients.redirect_uris': 'Redirects: {uris}',
156
+ 'admin.clients.dynamic_notice': 'O registro dinâmico de clients está ligado — clients registrados via /reg vivem no adapter e não aparecem nesta lista.',
157
+ // Console admin — auditoria.
158
+ 'admin.audit.page_title': 'Auditoria',
159
+ 'admin.audit.title': 'Log de auditoria',
160
+ 'admin.audit.type_placeholder': 'Filtrar por tipo',
161
+ 'admin.audit.subject_placeholder': 'Filtrar por subject (accountId)',
162
+ 'admin.audit.filter': 'Filtrar',
163
+ 'admin.audit.empty': 'Nenhum evento encontrado.',
164
+ 'admin.audit.not_supported': 'O sink de auditoria configurado não suporta consulta.',
165
+ // Console admin — paginação compartilhada.
166
+ 'admin.pagination.page': 'Página {page} de {total}',
167
+ 'admin.pagination.prev': 'Anterior',
168
+ 'admin.pagination.next': 'Próxima',
169
+ // Mensagens de erro/flash produzidas pelos controllers.
170
+ 'errors.invalid_credentials': 'Credenciais inválidas',
171
+ 'errors.invalid_code': 'Código inválido',
172
+ 'errors.email_taken': 'E-mail já cadastrado',
173
+ 'errors.signup_failed': 'Não foi possível criar a conta',
174
+ 'errors.invalid_or_expired_token': 'Token inválido ou expirado',
175
+ 'errors.account_locked': 'Conta temporariamente bloqueada por excesso de tentativas. Tente novamente em {seconds}s.',
176
+ };
177
+ /**
178
+ * Resolve o catálogo ativo: mescla os overrides do locale selecionado SOBRE o
179
+ * default pt-BR. Sem config, retorna os defaults intactos. Chaves omitidas pelo
180
+ * locale escolhido caem no default pt-BR (fallback de cobertura).
181
+ */
182
+ export function resolveMessages(i18n) {
183
+ const base = { ...DEFAULT_MESSAGES };
184
+ const locale = i18n?.locale ?? DEFAULT_LOCALE;
185
+ const overrides = i18n?.messages?.[locale];
186
+ if (!overrides)
187
+ return base;
188
+ // Mescla só valores definidos (o `Partial` permite undefined); chaves omitidas
189
+ // seguem caindo no default pt-BR.
190
+ for (const [key, value] of Object.entries(overrides)) {
191
+ if (value !== undefined)
192
+ base[key] = value;
193
+ }
194
+ return base;
195
+ }
196
+ /**
197
+ * Retorna a string para `key` (cai na própria `key` quando ausente) com
198
+ * interpolação no estilo `{name}`. Mantém placeholders sem valor intactos.
199
+ */
200
+ export function translate(messages, key, params) {
201
+ const template = messages[key] ?? key;
202
+ if (!params)
203
+ return template;
204
+ return template.replace(/\{(\w+)\}/g, (match, name) => {
205
+ const value = params[name];
206
+ return value === undefined ? match : String(value);
207
+ });
208
+ }
@@ -0,0 +1,7 @@
1
+ import '../augmentations.js';
2
+ import type { HttpContext } from '@adonisjs/core/http';
3
+ import type { NextFn } from '@adonisjs/core/types/http';
4
+ export declare const ACCOUNT_SESSION_KEY = "account_user_id";
5
+ export default class AccountAuthMiddleware {
6
+ handle(ctx: HttpContext, next: NextFn): Promise<any>;
7
+ }
@@ -0,0 +1,11 @@
1
+ import '../augmentations.js';
2
+ export const ACCOUNT_SESSION_KEY = 'account_user_id';
3
+ export default class AccountAuthMiddleware {
4
+ async handle(ctx, next) {
5
+ const userId = ctx.session.get(ACCOUNT_SESSION_KEY);
6
+ if (!userId) {
7
+ return ctx.response.redirect('/account/login');
8
+ }
9
+ return next();
10
+ }
11
+ }
@@ -0,0 +1,32 @@
1
+ import type { HttpContext } from '@adonisjs/core/http';
2
+ import type { ResolvedRateLimitConfig } from '../define_config.js';
3
+ /**
4
+ * Assinatura mínima de um middleware do AdonisJS. Evita acoplar o tipo concreto
5
+ * do `@adonisjs/limiter` (que pode não estar instalado no host).
6
+ */
7
+ export type ThrottleMiddleware = (ctx: HttpContext, next: () => Promise<void>) => Promise<void>;
8
+ /**
9
+ * Os throttles construídos para as rotas sensíveis do host-kit.
10
+ * - `login`: compartilhado por login/signup/forgot/reset (keyed por IP).
11
+ * - `introspection`: introspecção de PAT (keyed por IP ou pelo bearer secret).
12
+ */
13
+ export interface AuthThrottles {
14
+ login: ThrottleMiddleware;
15
+ introspection: ThrottleMiddleware;
16
+ }
17
+ /**
18
+ * Service do `@adonisjs/limiter` resolvido de forma preguiçosa. Tipado como `any`
19
+ * de propósito: a lib NÃO depende do limiter em tempo de compilação (peer/opt-in).
20
+ */
21
+ type LimiterService = any;
22
+ /**
23
+ * Permite reapontar/limpar o loader do limiter (usado em testes).
24
+ * @internal
25
+ */
26
+ export declare function __setLimiterLoaderForTests(fn: (() => Promise<LimiterService | null>) | undefined): void;
27
+ /**
28
+ * Cria os throttles do host-kit a partir da config resolvida.
29
+ * Retorna `undefined` quando rate-limit está desligado (rotas montadas sem throttle).
30
+ */
31
+ export declare function createAuthThrottles(config: ResolvedRateLimitConfig): AuthThrottles | undefined;
32
+ export {};
@@ -0,0 +1,87 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ let limiterServicePromise;
10
+ /**
11
+ * Importa o service do limiter do HOST de forma preguiçosa e fail-safe.
12
+ * Se `@adonisjs/limiter` não estiver instalado/configurado, resolve `null`
13
+ * e o throttle vira no-op (não quebra o boot nem a request).
14
+ */
15
+ async function loadLimiter() {
16
+ if (!limiterServicePromise) {
17
+ // Indireção via variável: o `@adonisjs/limiter` é peer/opcional e pode não
18
+ // estar instalado na lib, então o specifier não é resolvido em build-time.
19
+ const specifier = '@adonisjs/limiter/services/main';
20
+ limiterServicePromise = import(__rewriteRelativeImportExtension(specifier))
21
+ .then((mod) => mod.default ?? null)
22
+ .catch(() => null);
23
+ }
24
+ return limiterServicePromise;
25
+ }
26
+ /**
27
+ * Permite reapontar/limpar o loader do limiter (usado em testes).
28
+ * @internal
29
+ */
30
+ export function __setLimiterLoaderForTests(fn) {
31
+ if (fn) {
32
+ limiterServicePromise = fn();
33
+ }
34
+ else {
35
+ limiterServicePromise = undefined;
36
+ }
37
+ }
38
+ /**
39
+ * Constrói um middleware de throttle preguiçoso. A configuração do limiter
40
+ * (`allowRequests().every().usingKey()`) só é resolvida na primeira request,
41
+ * porque o service do limiter é importado de forma assíncrona. Se o limiter
42
+ * não existir, o middleware passa adiante sem throttle (fail-safe).
43
+ */
44
+ function buildThrottle(name, bucket, store, keyOf) {
45
+ let middleware;
46
+ return async (ctx, next) => {
47
+ if (!middleware) {
48
+ const limiter = await loadLimiter();
49
+ if (!limiter) {
50
+ // Limiter indisponível: degrada para no-op (sem quebrar a request).
51
+ middleware = async (_ctx, n) => n();
52
+ }
53
+ else {
54
+ middleware = limiter.define(name, (reqCtx) => {
55
+ let b = limiter.allowRequests(bucket.points).every(bucket.duration);
56
+ if (store)
57
+ b = b.store(store);
58
+ const key = keyOf?.(reqCtx);
59
+ if (key)
60
+ b = b.usingKey(key);
61
+ return b;
62
+ });
63
+ }
64
+ }
65
+ return middleware(ctx, next);
66
+ };
67
+ }
68
+ /**
69
+ * Cria os throttles do host-kit a partir da config resolvida.
70
+ * Retorna `undefined` quando rate-limit está desligado (rotas montadas sem throttle).
71
+ */
72
+ export function createAuthThrottles(config) {
73
+ if (!config.enabled)
74
+ return undefined;
75
+ return {
76
+ // Login/signup/forgot/reset: keyed por IP (default do HttpLimiter).
77
+ login: buildThrottle('authkit_login', config.login, config.store),
78
+ // Introspecção de PAT: keyed pelo bearer secret quando presente, senão por IP.
79
+ introspection: buildThrottle('authkit_pat_introspection', config.introspection, config.store, (ctx) => {
80
+ const auth = ctx.request.header('authorization');
81
+ if (auth && auth.toLowerCase().startsWith('bearer ')) {
82
+ return `bearer:${auth.slice(7).trim()}`;
83
+ }
84
+ return undefined;
85
+ }),
86
+ };
87
+ }
@@ -0,0 +1,41 @@
1
+ import type { Router } from '@adonisjs/core/http';
2
+ import type { AuthSocialConfig, RateLimitConfigInput } from '../define_config.js';
3
+ /**
4
+ * Guard do console admin (B6). Como o `accountGuard`, é uma closure inline (forma
5
+ * confiável do `.use()` num grupo). Exige:
6
+ * 1. sessão de conta ativa (senão → /account/login);
7
+ * 2. a conta logada com pelo menos UMA das `config.admin.roles` nas roles globais
8
+ * (senão → /account/tokens, evitando vazar a existência do /admin).
9
+ * As roles permitidas são resolvidas em runtime do `authkit.server` (config lazy).
10
+ */
11
+ export declare const adminGuard: (ctx: any, next: () => Promise<void>) => Promise<any>;
12
+ export interface AuthHostOptions {
13
+ /** Onde o provider OIDC é montado (default '/oidc'). Deve casar com o final do issuer. */
14
+ mountPath: string;
15
+ /**
16
+ * Login social opt-in; quando presente, monta as rotas sociais (usam ctx.ally).
17
+ * Necessário aqui (e não só no config) porque a decisão de montar as rotas é
18
+ * tomada em tempo de registro, antes do config (lazy) resolver.
19
+ */
20
+ social?: AuthSocialConfig;
21
+ /**
22
+ * Rate-limiting (anti-brute-force) das rotas sensíveis. Necessário aqui (e não
23
+ * só no config) porque a aplicação do throttle acontece em tempo de registro de
24
+ * rota. Ligado por default (mesma resolução do config). Espelhe o `rateLimit` de
25
+ * config/authkit.ts. Se `@adonisjs/limiter` não estiver configurado no host
26
+ * (config/limiter.ts), o throttle vira no-op (fail-safe).
27
+ */
28
+ rateLimit?: RateLimitConfigInput;
29
+ /**
30
+ * Console admin opt-in (B6); quando `true`, monta o grupo `/admin/*` atrás do
31
+ * adminGuard. Necessário aqui (e não só no config) porque a decisão de montar
32
+ * as rotas é tomada em tempo de registro, antes do config (lazy) resolver.
33
+ * Espelhe o `admin.enabled` de config/authkit.ts.
34
+ */
35
+ admin?: boolean;
36
+ }
37
+ /**
38
+ * Monta todas as rotas do host-kit do Authorization Server numa chamada.
39
+ * Substitui registerOidcRoutes + o hand-wiring do start/routes.ts do host.
40
+ */
41
+ export declare function registerAuthHost(router: Router, opts: AuthHostOptions): void;