@adonis-agora/authkit-server 0.67.0 → 0.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/accounts/lucid_account_store.d.ts +17 -10
- package/build/src/accounts/lucid_account_store.js +25 -11
- package/build/src/accounts/lucid_stores.d.ts +9 -8
- package/build/src/accounts/lucid_stores.js +4 -4
- package/build/src/doctor/checks.d.ts +5 -1
- package/build/src/doctor/checks.js +18 -5
- package/package.json +1 -1
|
@@ -138,20 +138,27 @@ export interface LucidAccountStoreOptions {
|
|
|
138
138
|
/**
|
|
139
139
|
* Models Lucid para organizations (multi-tenancy).
|
|
140
140
|
*
|
|
141
|
-
* -
|
|
142
|
-
* que já mapeiam as três tabelas
|
|
143
|
-
* `
|
|
144
|
-
*
|
|
145
|
-
*
|
|
141
|
+
* - **Ausente (default)** → usa os models DEFAULT da lib
|
|
142
|
+
* ({@link defaultOrganizationModels}), que já mapeiam as três tabelas
|
|
143
|
+
* lib-owned (`auth_organizations`, `auth_organization_members`,
|
|
144
|
+
* `auth_organization_invitations`). A `OrganizationsCapability` passa a
|
|
145
|
+
* existir por padrão. Isso é seguro porque as rotas do console de conta para
|
|
146
|
+
* orgs JÁ eram montadas por default (`register_auth_host`, bloco `if
|
|
147
|
+
* (mountOrgs)`, com controller capability-probed); antes, sem os models, a
|
|
148
|
+
* tela montada respondia 403; agora ela funciona. Não há tela nova — só uma
|
|
149
|
+
* que deixou de estar quebrada. As tabelas são criadas/evoluídas pelo
|
|
150
|
+
* `ensureAuthkitSchema`, então o mapeamento não é decisão do host.
|
|
151
|
+
* - `true` → idêntico ao default (atalho explícito; é o que apps existentes
|
|
152
|
+
* já usam e continua valendo).
|
|
146
153
|
* - `{ OrgModel, MemberModel, InvitationModel }` → escape hatch, para quem
|
|
147
154
|
* guarda as tabelas de auth numa conexão/schema próprios (os defaults não
|
|
148
155
|
* declaram `static connection`).
|
|
149
|
-
* -
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* `
|
|
156
|
+
* - `false` → opt-out explícito: `OrganizationsCapability` AUSENTE no store.
|
|
157
|
+
* Use quando a dependência atual é `supportsOrganizations === false` (ex.:
|
|
158
|
+
* store/rotas que assumem a ausência). O `authkit:doctor` avisa se
|
|
159
|
+
* `organizations.enabled: true` e o store não tem a capability.
|
|
153
160
|
*/
|
|
154
|
-
organizationModels?: true | {
|
|
161
|
+
organizationModels?: true | false | {
|
|
155
162
|
OrgModel: any;
|
|
156
163
|
MemberModel: any;
|
|
157
164
|
InvitationModel: any;
|
|
@@ -130,7 +130,15 @@ export function lucidAccountStore(Model, options = {}) {
|
|
|
130
130
|
const encrypter = options.encrypter === false ? undefined : (options.encrypter ?? appKeyEncrypter());
|
|
131
131
|
const ProviderIdentityModel = options.providerIdentityModel;
|
|
132
132
|
const WebauthnCredentialModel = options.webauthnCredentialModel;
|
|
133
|
-
|
|
133
|
+
// Organizations é padrão: ausente OU `true` → models default da lib. O
|
|
134
|
+
// opt-out explícito é `false`. O trio explícito segue como escape hatch.
|
|
135
|
+
const orgModelsOption = options.organizationModels;
|
|
136
|
+
const usesDefaultOrgModels = orgModelsOption === undefined || orgModelsOption === true;
|
|
137
|
+
const OrgModels = orgModelsOption === false
|
|
138
|
+
? undefined
|
|
139
|
+
: usesDefaultOrgModels
|
|
140
|
+
? defaultOrganizationModels
|
|
141
|
+
: orgModelsOption;
|
|
134
142
|
// RP do WebAuthn: usado nas cerimônias. Default do rpName cai no mfaIssuer.
|
|
135
143
|
const webauthn = options.webauthn ?? {
|
|
136
144
|
rpName: mfaIssuer,
|
|
@@ -222,17 +230,23 @@ export function lucidAccountStore(Model, options = {}) {
|
|
|
222
230
|
// Preferência por usuário de tipos de login: só quando o model tem a coluna
|
|
223
231
|
// `login_methods` (JSONB). Sem a coluna → capacidade ausente (feature no-op).
|
|
224
232
|
...(supportsLoginMethodsColumn(Model) ? buildLoginMethods(ctx) : {}),
|
|
225
|
-
// Organizations (multi-tenancy):
|
|
233
|
+
// Organizations (multi-tenancy): por padrão usa os models default da lib;
|
|
234
|
+
// ausente só com `organizationModels: false` (opt-out explícito).
|
|
226
235
|
...(OrgModels
|
|
227
|
-
?
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
+
? {
|
|
237
|
+
// Origem dos models, para o `authkit:doctor` reportar sem re-inferir.
|
|
238
|
+
// NÃO faz parte do contrato AccountStore.
|
|
239
|
+
__organizationModelsSource: usesDefaultOrgModels ? 'default' : 'explicit',
|
|
240
|
+
...buildOrganizations({
|
|
241
|
+
OrgModel: OrgModels.OrgModel,
|
|
242
|
+
MemberModel: OrgModels.MemberModel,
|
|
243
|
+
InvitationModel: OrgModels.InvitationModel,
|
|
244
|
+
findAccountEmail: async (accountId) => {
|
|
245
|
+
const row = await Model.find(accountId);
|
|
246
|
+
return row?.email ?? null;
|
|
247
|
+
},
|
|
248
|
+
}),
|
|
249
|
+
}
|
|
236
250
|
: {}),
|
|
237
251
|
// Config de senha resolvida — exposta (não-enumerável) para o authkit:doctor
|
|
238
252
|
// inspecionar policy/checkPwned. NÃO faz parte do contrato AccountStore.
|
|
@@ -17,12 +17,13 @@ export interface LucidStoresModels {
|
|
|
17
17
|
/**
|
|
18
18
|
* Organizations (multi-tenancy) — habilita a `OrganizationsCapability`.
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
* pelo `ensureAuthkitSchema`)
|
|
22
|
-
*
|
|
20
|
+
* **Ausente → ligada por padrão** (models default da lib; as três tabelas são
|
|
21
|
+
* lib-owned, criadas pelo `ensureAuthkitSchema`). `true` é o atalho explícito
|
|
22
|
+
* para o mesmo caminho; `false` é o opt-out (capability ausente). O trio
|
|
23
|
+
* explícito fica como escape hatch para quem guarda as tabelas de auth numa
|
|
23
24
|
* conexão/schema próprios.
|
|
24
25
|
*/
|
|
25
|
-
organizations?: true | {
|
|
26
|
+
organizations?: true | false | {
|
|
26
27
|
OrgModel: any;
|
|
27
28
|
MemberModel: any;
|
|
28
29
|
InvitationModel: any;
|
|
@@ -49,9 +50,9 @@ export type LucidStoresOptions = Omit<LucidAccountStoreOptions, 'providerIdentit
|
|
|
49
50
|
* )
|
|
50
51
|
* ```
|
|
51
52
|
*
|
|
52
|
-
*
|
|
53
|
-
* vivem numa conexão/schema próprios, passe
|
|
54
|
-
* (`{ OrgModel, MemberModel, InvitationModel }`) — os defaults
|
|
55
|
-
* `static connection`.
|
|
53
|
+
* Organizations é ligada por padrão (models default da lib); `organizations:
|
|
54
|
+
* false` desliga. Se as tabelas de auth vivem numa conexão/schema próprios, passe
|
|
55
|
+
* o trio explícito (`{ OrgModel, MemberModel, InvitationModel }`) — os defaults
|
|
56
|
+
* não declaram `static connection`.
|
|
56
57
|
*/
|
|
57
58
|
export declare function lucidStores(models: LucidStoresModels, options?: LucidStoresOptions): LucidStoresResult;
|
|
@@ -15,10 +15,10 @@ import { lucidAccountStore } from './lucid_account_store.js';
|
|
|
15
15
|
* )
|
|
16
16
|
* ```
|
|
17
17
|
*
|
|
18
|
-
*
|
|
19
|
-
* vivem numa conexão/schema próprios, passe
|
|
20
|
-
* (`{ OrgModel, MemberModel, InvitationModel }`) — os defaults
|
|
21
|
-
* `static connection`.
|
|
18
|
+
* Organizations é ligada por padrão (models default da lib); `organizations:
|
|
19
|
+
* false` desliga. Se as tabelas de auth vivem numa conexão/schema próprios, passe
|
|
20
|
+
* o trio explícito (`{ OrgModel, MemberModel, InvitationModel }`) — os defaults
|
|
21
|
+
* não declaram `static connection`.
|
|
22
22
|
*/
|
|
23
23
|
export function lucidStores(models, options = {}) {
|
|
24
24
|
const accountStore = lucidAccountStore(models.account, {
|
|
@@ -119,7 +119,11 @@ export declare function checkAccessTokens(input: DoctorInput): Finding | null;
|
|
|
119
119
|
/**
|
|
120
120
|
* Organizations (multi-tenancy). Informa se a capacidade está disponível
|
|
121
121
|
* (store expõe createOrg) e avisa se `organizations.enabled: true` no config mas
|
|
122
|
-
* a capacidade não está presente no store
|
|
122
|
+
* a capacidade não está presente no store.
|
|
123
|
+
*
|
|
124
|
+
* Com `lucidAccountStore()`, a capability existe POR PADRÃO (models default da
|
|
125
|
+
* lib); o aviso abaixo só é alcançável para store não-lucid que não a implementa
|
|
126
|
+
* ou para um store lucid construído com `organizationModels: false` (opt-out).
|
|
123
127
|
*/
|
|
124
128
|
export declare function checkOrganizations(input: DoctorInput): Finding | null;
|
|
125
129
|
/**
|
|
@@ -488,7 +488,11 @@ export function checkAccessTokens(input) {
|
|
|
488
488
|
/**
|
|
489
489
|
* Organizations (multi-tenancy). Informa se a capacidade está disponível
|
|
490
490
|
* (store expõe createOrg) e avisa se `organizations.enabled: true` no config mas
|
|
491
|
-
* a capacidade não está presente no store
|
|
491
|
+
* a capacidade não está presente no store.
|
|
492
|
+
*
|
|
493
|
+
* Com `lucidAccountStore()`, a capability existe POR PADRÃO (models default da
|
|
494
|
+
* lib); o aviso abaixo só é alcançável para store não-lucid que não a implementa
|
|
495
|
+
* ou para um store lucid construído com `organizationModels: false` (opt-out).
|
|
492
496
|
*/
|
|
493
497
|
export function checkOrganizations(input) {
|
|
494
498
|
const cfg = input.authkitConfig;
|
|
@@ -501,17 +505,26 @@ export function checkOrganizations(input) {
|
|
|
501
505
|
return {
|
|
502
506
|
level: 'warn',
|
|
503
507
|
message: 'organizations.enabled: true, but the accountStore has no OrganizationsCapability — ' +
|
|
504
|
-
'
|
|
505
|
-
'
|
|
506
|
-
'
|
|
508
|
+
'with `lucidAccountStore()` it is present by default; if you passed ' +
|
|
509
|
+
'`organizationModels: false`, drop the opt-out (or pass the explicit ' +
|
|
510
|
+
'`{ OrgModel, MemberModel, InvitationModel }` trio when the auth tables live on their ' +
|
|
511
|
+
'own connection/schema). Expected tables: auth_organizations, ' +
|
|
507
512
|
'auth_organization_members, auth_organization_invitations.',
|
|
508
513
|
};
|
|
509
514
|
}
|
|
510
515
|
if (storeSupports) {
|
|
511
516
|
const roles = cfg.organizations?.roles ?? ['owner', 'admin', 'member'];
|
|
517
|
+
// Origem dos models: default da lib (organizationModels ausente/true) ou
|
|
518
|
+
// trio explícito do host. Ausente em store não-lucid → wording genérica.
|
|
519
|
+
const source = store.__organizationModelsSource;
|
|
520
|
+
const models = source === 'default'
|
|
521
|
+
? 'lib defaults (organizationModels omitted or true)'
|
|
522
|
+
: source === 'explicit'
|
|
523
|
+
? 'host-provided explicit trio'
|
|
524
|
+
: 'lib defaults or host-provided models';
|
|
512
525
|
return {
|
|
513
526
|
level: 'ok',
|
|
514
|
-
message: `organizations capability present (roles: ${roles.join(', ')}).`,
|
|
527
|
+
message: `organizations capability present (models: ${models}; roles: ${roles.join(', ')}).`,
|
|
515
528
|
};
|
|
516
529
|
}
|
|
517
530
|
// Auto mode (enabled === undefined) and store doesn't support — silently ok (opt-in).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adonis-agora/authkit-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.68.0",
|
|
4
4
|
"description": "AdonisJS OIDC/OAuth2 provider (Identity Provider) toolkit: ejectable auth server with sessions, rate-limiting, MFA/TOTP, audit log, federated logout and OpenTelemetry metrics.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "dudousxd",
|