@oktis-works/auth 0.5.5 → 0.6.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.
@@ -0,0 +1,47 @@
1
+ export interface ApiKey {
2
+ id: string;
3
+ tenantId: string;
4
+ userId: string;
5
+ name: string;
6
+ keyPrefix: string;
7
+ oneTime: boolean;
8
+ expiresAt?: Date | null;
9
+ lastUsedAt?: Date | null;
10
+ useCount: number;
11
+ revokedAt?: Date | null;
12
+ createdBy?: string | null;
13
+ createdAt: Date;
14
+ }
15
+ export interface ApiKeyWithPlaintext extends ApiKey {
16
+ /** Valor completo — retornado SOMENTE na criação, nunca persistido em claro. */
17
+ plaintext: string;
18
+ }
19
+ export interface CreateApiKeyInput {
20
+ tenantId: string;
21
+ userId: string;
22
+ name: string;
23
+ oneTime?: boolean;
24
+ /** ISO string ou Date; null/undefined = sem expiração. */
25
+ expiresAt?: string | Date | null;
26
+ createdBy?: string;
27
+ }
28
+ export declare class ApiKeyService {
29
+ /**
30
+ * Cria uma key e devolve o valor claro UMA única vez.
31
+ * Formato: okcms_<prefix-hex>_<secret-base64url>
32
+ */
33
+ create(input: CreateApiKeyInput): Promise<ApiKeyWithPlaintext>;
34
+ /**
35
+ * Valida o valor completo e registra o consumo (last_used_at/use_count).
36
+ * Keys single-use são revogadas aqui; expiradas/revogadas/uso único estourado
37
+ * devolvem null.
38
+ */
39
+ verify(plaintext: string, tenantId: string): Promise<ApiKey | null>;
40
+ /** Lista as keys do tenant (nunca expõe key_hash). */
41
+ list(tenantId: string): Promise<ApiKey[]>;
42
+ /** Revogação lógica — a key deixa de ser aceita no login imediatamente. */
43
+ revoke(id: string, tenantId: string): Promise<boolean>;
44
+ /** Remove keys revogadas/expiradas há mais de 30 dias (higiene de banco). */
45
+ cleanup(): Promise<number>;
46
+ }
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api-keys/index.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mBAAoB,SAAQ,MAAM;IACjD,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0CD,qBAAa,aAAa;IACxB;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmCpE;;;;OAIG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA2CzE,sDAAsD;IAChD,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAc/C,2EAA2E;IACrE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc5D,6EAA6E;IACvE,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAOjC"}
@@ -0,0 +1,158 @@
1
+ // @oktis-works/auth - API Keys para clientes API-first
2
+ //
3
+ // A API key NUNCA autoriza requests diretamente: ela é trocada por
4
+ // access JWT + refresh token em POST /api/v1/auth/api-key-login. Guardamos
5
+ // apenas o hash sha256 do valor completo; o prefixo em claro serve para
6
+ // localizar a row sob RLS (lookup transacional com contexto de tenant).
7
+ import { createHash, randomBytes, randomUUID, timingSafeEqual } from 'node:crypto';
8
+ import { getConnection } from '@oktis-works/database';
9
+ const KEY_ALGORITHM = 'okcms';
10
+ function hashApiKey(plaintext) {
11
+ return createHash('sha256').update(plaintext).digest('hex');
12
+ }
13
+ /** Constant-time compare de dois hashes hex de mesmo tamanho. */
14
+ function safeCompare(a, b) {
15
+ if (a.length !== b.length)
16
+ return false;
17
+ try {
18
+ return timingSafeEqual(Buffer.from(a, 'hex'), Buffer.from(b, 'hex'));
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ function normalizeExpiry(value) {
25
+ if (!value)
26
+ return null;
27
+ const date = value instanceof Date ? value : new Date(value);
28
+ if (Number.isNaN(date.getTime()))
29
+ throw new Error('Invalid expiresAt');
30
+ return date.toISOString();
31
+ }
32
+ function mapApiKey(row) {
33
+ return {
34
+ id: String(row['id']),
35
+ tenantId: String(row['tenant_id'] ?? row['tenantId']),
36
+ userId: String(row['user_id'] ?? row['userId']),
37
+ name: String(row['name']),
38
+ keyPrefix: String(row['key_prefix'] ?? row['keyPrefix']),
39
+ oneTime: Boolean(row['one_time'] ?? row['oneTime']),
40
+ expiresAt: (row['expires_at'] ?? row['expiresAt']),
41
+ lastUsedAt: (row['last_used_at'] ?? row['lastUsedAt']),
42
+ useCount: Number(row['use_count'] ?? row['useCount'] ?? 0),
43
+ revokedAt: (row['revoked_at'] ?? row['revokedAt']),
44
+ createdBy: (row['created_by'] ?? row['createdBy']),
45
+ createdAt: new Date(String(row['created_at'] ?? row['createdAt'])),
46
+ };
47
+ }
48
+ export class ApiKeyService {
49
+ /**
50
+ * Cria uma key e devolve o valor claro UMA única vez.
51
+ * Formato: okcms_<prefix-hex>_<secret-base64url>
52
+ */
53
+ async create(input) {
54
+ const sql = getConnection();
55
+ const secret = randomBytes(32).toString('base64url');
56
+ const prefix = randomBytes(8).toString('hex');
57
+ const plaintext = `${KEY_ALGORITHM}_${prefix}_${secret}`;
58
+ const expiresAt = normalizeExpiry(input.expiresAt);
59
+ const insertQuery = `INSERT INTO api_keys
60
+ (id, tenant_id, user_id, name, key_prefix, key_hash, one_time, expires_at, created_by)
61
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
62
+ RETURNING *`;
63
+ const values = [
64
+ randomUUID(),
65
+ input.tenantId,
66
+ input.userId,
67
+ input.name,
68
+ prefix,
69
+ hashApiKey(plaintext),
70
+ input.oneTime ?? false,
71
+ expiresAt,
72
+ input.createdBy ?? null,
73
+ ];
74
+ // Transação + contexto de tenant local: RLS aplica mesmo quando a
75
+ // conexão vem de pool compartilhado (mesmo padrão de SessionService).
76
+ const run = async (tx) => {
77
+ await tx.unsafe("SELECT set_config('app.current_tenant_id', $1, true)", [input.tenantId]);
78
+ const result = await tx.unsafe(insertQuery, values);
79
+ return { ...mapApiKey(result[0]), plaintext };
80
+ };
81
+ if (typeof sql.begin !== 'function')
82
+ return run(sql);
83
+ return sql.begin(run);
84
+ }
85
+ /**
86
+ * Valida o valor completo e registra o consumo (last_used_at/use_count).
87
+ * Keys single-use são revogadas aqui; expiradas/revogadas/uso único estourado
88
+ * devolvem null.
89
+ */
90
+ async verify(plaintext, tenantId) {
91
+ const sql = getConnection();
92
+ const parts = plaintext.split('_');
93
+ if (parts.length !== 3 || parts[0] !== KEY_ALGORITHM)
94
+ return null;
95
+ const prefix = parts[1];
96
+ const expectedHash = hashApiKey(plaintext);
97
+ const run = async (tx) => {
98
+ // Lookup restrito ao prefixo + tenant: a policy api_key_prefix_lookup
99
+ // permite o SELECT antes do contexto "oficial" da requisição existir.
100
+ await tx.unsafe("SELECT set_config('app.current_api_key_prefix', $1, true)", [prefix]);
101
+ await tx.unsafe("SELECT set_config('app.current_tenant_id', $1, true)", [tenantId]);
102
+ const rows = await tx.unsafe('SELECT * FROM api_keys WHERE tenant_id = $1 AND key_prefix = $2 LIMIT 1', [tenantId, prefix]);
103
+ const row = rows[0];
104
+ if (!row)
105
+ return null;
106
+ const storedHash = String(row['key_hash'] ?? '');
107
+ const revokedAt = row['revoked_at'];
108
+ const expiresAt = row['expires_at'];
109
+ if (!safeCompare(storedHash, expectedHash))
110
+ return null;
111
+ if (revokedAt)
112
+ return null;
113
+ if (expiresAt && new Date(expiresAt).getTime() <= Date.now())
114
+ return null;
115
+ const updated = await tx.unsafe(`UPDATE api_keys
116
+ SET last_used_at = NOW(),
117
+ use_count = use_count + 1,
118
+ revoked_at = CASE WHEN one_time THEN NOW() ELSE revoked_at END
119
+ WHERE id = $1
120
+ RETURNING *`, [String(row['id'])]);
121
+ return updated[0] ? mapApiKey(updated[0]) : null;
122
+ };
123
+ if (typeof sql.begin !== 'function')
124
+ return run(sql);
125
+ return sql.begin(run);
126
+ }
127
+ /** Lista as keys do tenant (nunca expõe key_hash). */
128
+ async list(tenantId) {
129
+ const sql = getConnection();
130
+ const run = async (tx) => {
131
+ await tx.unsafe("SELECT set_config('app.current_tenant_id', $1, true)", [tenantId]);
132
+ const rows = await tx.unsafe('SELECT * FROM api_keys WHERE tenant_id = $1 ORDER BY created_at DESC', [tenantId]);
133
+ return rows.map(mapApiKey);
134
+ };
135
+ if (typeof sql.begin !== 'function')
136
+ return run(sql);
137
+ return sql.begin(run);
138
+ }
139
+ /** Revogação lógica — a key deixa de ser aceita no login imediatamente. */
140
+ async revoke(id, tenantId) {
141
+ const sql = getConnection();
142
+ const run = async (tx) => {
143
+ await tx.unsafe("SELECT set_config('app.current_tenant_id', $1, true)", [tenantId]);
144
+ const result = await tx.unsafe('UPDATE api_keys SET revoked_at = COALESCE(revoked_at, NOW()) WHERE id = $1 AND tenant_id = $2 AND revoked_at IS NULL RETURNING id', [id, tenantId]);
145
+ return result.length > 0;
146
+ };
147
+ if (typeof sql.begin !== 'function')
148
+ return run(sql);
149
+ return sql.begin(run);
150
+ }
151
+ /** Remove keys revogadas/expiradas há mais de 30 dias (higiene de banco). */
152
+ async cleanup() {
153
+ const sql = getConnection();
154
+ const result = await sql.unsafe("DELETE FROM api_keys WHERE (revoked_at IS NOT NULL AND revoked_at < NOW() - INTERVAL '30 days') OR (expires_at IS NOT NULL AND expires_at < NOW() - INTERVAL '30 days')");
155
+ return result.count;
156
+ }
157
+ }
158
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api-keys/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  export { AuthService } from './service.js';
2
- export type { AuthResult, RegisterInput, LoginInput } from './service.js';
2
+ export type { AuthResult, RegisterInput, LoginInput, ApiKeyLoginInput } from './service.js';
3
3
  export { JWTService } from './jwt/index.js';
4
4
  export type { TokenPayload, TokenPair } from './jwt/index.js';
5
5
  export { RBACService } from './rbac/index.js';
6
6
  export type { Permission, RolePermissions, RBACPolicy } from './rbac/index.js';
7
7
  export { SessionService } from './sessions/index.js';
8
8
  export type { Session } from './sessions/index.js';
9
+ export { ApiKeyService } from './api-keys/index.js';
10
+ export type { ApiKey, ApiKeyWithPlaintext, CreateApiKeyInput } from './api-keys/index.js';
9
11
  export { hashPassword, verifyPassword } from './password/index.js';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,MAAM,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -3,5 +3,6 @@ export { AuthService } from './service.js';
3
3
  export { JWTService } from './jwt/index.js';
4
4
  export { RBACService } from './rbac/index.js';
5
5
  export { SessionService } from './sessions/index.js';
6
+ export { ApiKeyService } from './api-keys/index.js';
6
7
  export { hashPassword, verifyPassword } from './password/index.js';
7
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -6,6 +6,12 @@ export interface Permission {
6
6
  export interface RolePermissions {
7
7
  role: string;
8
8
  permissions: Permission[];
9
+ /**
10
+ * Negações explícitas (valem mesmo contra um wildcard na permissão).
11
+ * Ex.: o gestor do tenant vê plugins (`read`) mas só o SUPER_ADMIN
12
+ * instala/ativa/remove (`create`/`update`/`delete`).
13
+ */
14
+ denies?: Permission[];
9
15
  }
10
16
  export interface RBACPolicy {
11
17
  roles: RolePermissions[];
@@ -15,6 +21,8 @@ export declare class RBACService {
15
21
  private policy;
16
22
  constructor(policy?: RBACPolicy);
17
23
  hasPermission(userRoles: string[], action: string, resource: string, context?: Record<string, unknown>): boolean;
24
+ private isDenied;
25
+ private walkRoles;
18
26
  getUserPermissions(userRoles: string[]): Permission[];
19
27
  private resolvePermissions;
20
28
  private checkConditions;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AAmDD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,CAAC,EAAE,UAAU;IAI/B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAqBhH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;IAIrD,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,eAAe;CAYxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACvC;AA2DD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,CAAC,EAAE,UAAU;IAI/B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IA2BhH,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,SAAS;IA0BjB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;IAIrD,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,eAAe;CAYxB"}
@@ -12,6 +12,14 @@ const DEFAULT_POLICY = {
12
12
  // `roles` vs política `role`, taxonomy, content-type...) e davam 403
13
13
  // para o próprio dono do tenant.
14
14
  permissions: [{ action: '*', resource: '*' }],
15
+ // ...menos gestão de plugins: instalação/ativação/remoção é operação de
16
+ // plataforma (SUPER_ADMIN). Listar (`read`) continua liberado, afinal o
17
+ // gestor do tenant precisa ver o que está ativo nele.
18
+ denies: [
19
+ { action: 'create', resource: 'plugin' },
20
+ { action: 'update', resource: 'plugin' },
21
+ { action: 'delete', resource: 'plugin' },
22
+ ],
15
23
  },
16
24
  {
17
25
  role: 'EDITOR',
@@ -53,6 +61,11 @@ export class RBACService {
53
61
  this.policy = policy ?? DEFAULT_POLICY;
54
62
  }
55
63
  hasPermission(userRoles, action, resource, context) {
64
+ // Denies vencem wildcard (ex.: TENANT_ADMIN vê plugins, não os gerencia) —
65
+ // exceto para o operador de plataforma, que a política nunca restringe.
66
+ if (!userRoles.includes('SUPER_ADMIN') && this.isDenied(userRoles, action, resource)) {
67
+ return false;
68
+ }
56
69
  const allPermissions = this.resolvePermissions(userRoles);
57
70
  return allPermissions.some(permission => {
58
71
  // Check action match
@@ -70,6 +83,34 @@ export class RBACService {
70
83
  return true;
71
84
  });
72
85
  }
86
+ isDenied(userRoles, action, resource) {
87
+ return this.walkRoles(userRoles, (rolePerms) => rolePerms.denies ?? []).some((deny) => {
88
+ const actionMatch = deny.action === '*' || deny.action === action;
89
+ const resourceMatch = deny.resource === '*' || deny.resource === resource;
90
+ return actionMatch && resourceMatch;
91
+ });
92
+ }
93
+ walkRoles(roles, extractor) {
94
+ const result = [];
95
+ const visited = new Set();
96
+ const resolve = (role) => {
97
+ if (visited.has(role))
98
+ return;
99
+ visited.add(role);
100
+ const rolePerms = this.policy.roles.find(r => r.role === role);
101
+ if (rolePerms) {
102
+ result.push(...extractor(rolePerms));
103
+ }
104
+ const inherited = this.policy.inheritance[role] ?? [];
105
+ for (const inheritedRole of inherited) {
106
+ resolve(inheritedRole);
107
+ }
108
+ };
109
+ for (const role of roles) {
110
+ resolve(role);
111
+ }
112
+ return result;
113
+ }
73
114
  getUserPermissions(userRoles) {
74
115
  return this.resolvePermissions(userRoles);
75
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rbac/index.ts"],"names":[],"mappings":"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"}
package/dist/service.d.ts CHANGED
@@ -22,15 +22,29 @@ export interface LoginInput {
22
22
  ipAddress?: string;
23
23
  userAgent?: string;
24
24
  }
25
+ export interface ApiKeyLoginInput {
26
+ apiKey: string;
27
+ /** UUID real do tenant (resolve o slug antes de chamar). */
28
+ tenantId: string;
29
+ ipAddress?: string;
30
+ userAgent?: string;
31
+ }
25
32
  export declare class AuthService {
26
33
  private jwt;
27
34
  private session;
28
35
  private rbac;
36
+ private apiKeys;
29
37
  private config;
30
38
  constructor(config: AuthConfig);
31
39
  register(input: RegisterInput): Promise<User>;
32
40
  private linkUserToTenant;
33
41
  login(input: LoginInput): Promise<AuthResult>;
42
+ /**
43
+ * Troca uma API key por access JWT + refresh token. A key é validada e
44
+ * consumida (single-use revoga aqui); a partir daí o cliente opera com o
45
+ * mesmo ciclo de sessão (refresh + reuse-detection) de um login normal.
46
+ */
47
+ loginWithApiKey(input: ApiKeyLoginInput): Promise<AuthResult | null>;
34
48
  refreshToken(refreshToken: string, options?: {
35
49
  ipAddress?: string;
36
50
  userAgent?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAM/C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAOxB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BrC,gBAAgB;IAyCxB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAmE7C,YAAY,CAChB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAgC1D,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,WAAW,CAAC,KAAK,EAAE,MAAM;IAI/B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAIhH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE;CAGvC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAO/C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAQxB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BrC,gBAAgB;IAyCxB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAmEnD;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiDpE,YAAY,CAChB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAgC1D,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,WAAW,CAAC,KAAK,EAAE,MAAM;IAI/B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAIhH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE;CAGvC"}
package/dist/service.js CHANGED
@@ -5,6 +5,7 @@ import { hashPassword, verifyPassword } from './password/index.js';
5
5
  import { JWTService } from './jwt/index.js';
6
6
  import { SessionService } from './sessions/index.js';
7
7
  import { RBACService } from './rbac/index.js';
8
+ import { ApiKeyService } from './api-keys/index.js';
8
9
  /** Remove credenciais de um usuário vindo de SELECT ou RETURNING * (o casing do driver varia). */
9
10
  function sanitizeUser(user) {
10
11
  const clone = { ...user };
@@ -16,12 +17,14 @@ export class AuthService {
16
17
  jwt;
17
18
  session;
18
19
  rbac;
20
+ apiKeys;
19
21
  config;
20
22
  constructor(config) {
21
23
  this.config = config;
22
24
  this.jwt = new JWTService(config);
23
25
  this.session = new SessionService();
24
26
  this.rbac = new RBACService();
27
+ this.apiKeys = new ApiKeyService();
25
28
  }
26
29
  async register(input) {
27
30
  const sql = getConnection();
@@ -115,6 +118,47 @@ export class AuthService {
115
118
  tenantId,
116
119
  };
117
120
  }
121
+ /**
122
+ * Troca uma API key por access JWT + refresh token. A key é validada e
123
+ * consumida (single-use revoga aqui); a partir daí o cliente opera com o
124
+ * mesmo ciclo de sessão (refresh + reuse-detection) de um login normal.
125
+ */
126
+ async loginWithApiKey(input) {
127
+ const sql = getConnection();
128
+ const tenantId = await resolveTenantId(input.tenantId);
129
+ await setTenantContext(tenantId);
130
+ const key = await this.apiKeys.verify(input.apiKey, tenantId);
131
+ if (!key)
132
+ return null;
133
+ const users = await sql.unsafe('SELECT * FROM users WHERE id = $1 AND status = $2', [key.userId, 'ACTIVE']);
134
+ if (users.length === 0)
135
+ return null;
136
+ const user = users[0];
137
+ const roles = await sql.unsafe(`SELECT r.slug
138
+ FROM roles r
139
+ JOIN tenant_users tu ON tu.role_id = r.id
140
+ WHERE tu.user_id = $1 AND tu.tenant_id = $2 AND tu.status = 'ACTIVE'`, [user.id, tenantId]);
141
+ const userRoles = roles.map((r) => r['slug']);
142
+ const accessToken = await this.jwt.generateAccessToken({
143
+ sub: user.id,
144
+ email: user.email,
145
+ tenantId,
146
+ roles: userRoles,
147
+ });
148
+ const session = await this.session.create(user.id, tenantId, {
149
+ ipAddress: input.ipAddress,
150
+ userAgent: input.userAgent,
151
+ expiresInSeconds: this.config.cookie.refreshTokenMaxAge ?? 60 * 60 * 24 * 30,
152
+ });
153
+ await sql.unsafe('UPDATE users SET last_login_at = NOW() WHERE id = $1', [user.id]);
154
+ return {
155
+ user: sanitizeUser(user),
156
+ accessToken,
157
+ refreshToken: session.refreshToken,
158
+ sessionId: session.id,
159
+ tenantId,
160
+ };
161
+ }
118
162
  async refreshToken(refreshToken, options) {
119
163
  const session = await this.session.rotate(refreshToken, {
120
164
  ...options,
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oktis-works/auth",
3
- "version": "0.5.5",
3
+ "version": "0.6.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -17,10 +17,10 @@
17
17
  "clean": "rm -rf dist tsconfig.tsbuildinfo"
18
18
  },
19
19
  "dependencies": {
20
- "@oktis-works/types": "^0.5.5",
21
- "@oktis-works/config": "^0.5.5",
22
- "@oktis-works/database": "^0.5.5",
23
- "@oktis-works/core": "^0.5.5"
20
+ "@oktis-works/types": "^0.6.0",
21
+ "@oktis-works/config": "^0.6.1",
22
+ "@oktis-works/database": "^0.6.0",
23
+ "@oktis-works/core": "^0.5.14"
24
24
  },
25
25
  "devDependencies": {
26
26
  "typescript": "5.7.3",