@kurdel/auth-db 0.1.0-beta.4 → 0.1.0-beta.6
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/README.md +192 -96
- package/lib/api-key-hasher.d.ts +15 -0
- package/lib/api-key-hasher.js +6 -0
- package/lib/api-key-hasher.js.map +1 -1
- package/lib/auth-database-module.d.ts +28 -0
- package/lib/auth-database-module.js +23 -0
- package/lib/auth-database-module.js.map +1 -1
- package/lib/auth-database-tables.d.ts +26 -0
- package/lib/auth-database-tables.js +28 -1
- package/lib/auth-database-tables.js.map +1 -1
- package/lib/database-api-key-repository.d.ts +29 -0
- package/lib/database-api-key-repository.js +29 -0
- package/lib/database-api-key-repository.js.map +1 -1
- package/lib/database-api-key-service.d.ts +33 -0
- package/lib/database-api-key-service.js +33 -0
- package/lib/database-api-key-service.js.map +1 -1
- package/lib/database-api-key-usage-recorder.d.ts +25 -1
- package/lib/database-api-key-usage-recorder.js +25 -1
- package/lib/database-api-key-usage-recorder.js.map +1 -1
- package/lib/database-auth-event-sink-provider.d.ts +8 -0
- package/lib/database-auth-event-sink-provider.js +15 -0
- package/lib/database-auth-event-sink-provider.js.map +1 -0
- package/lib/database-auth-event-store.d.ts +28 -1
- package/lib/database-auth-event-store.js +37 -1
- package/lib/database-auth-event-store.js.map +1 -1
- package/lib/database-auth-user-repository.d.ts +28 -0
- package/lib/database-auth-user-repository.js +28 -0
- package/lib/database-auth-user-repository.js.map +1 -1
- package/lib/database-jwt-session-repository.d.ts +27 -1
- package/lib/database-jwt-session-repository.js +27 -1
- package/lib/database-jwt-session-repository.js.map +1 -1
- package/lib/database-jwt-session-service.d.ts +55 -1
- package/lib/database-jwt-session-service.js +182 -1
- package/lib/database-jwt-session-service.js.map +1 -1
- package/lib/database-password-credential-repository.d.ts +27 -0
- package/lib/database-password-credential-repository.js +27 -0
- package/lib/database-password-credential-repository.js.map +1 -1
- package/lib/database-password-service.d.ts +31 -0
- package/lib/database-password-service.js +31 -0
- package/lib/database-password-service.js.map +1 -1
- package/lib/database-user-service.d.ts +47 -13
- package/lib/database-user-service.js +273 -190
- package/lib/database-user-service.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/tokens.d.ts +8 -0
- package/lib/tokens.js +8 -0
- package/lib/tokens.js.map +1 -1
- package/package.json +5 -5
|
@@ -19,7 +19,40 @@ export class ApiKeyNotFoundError extends Error {
|
|
|
19
19
|
this.apiKeyId = apiKeyId;
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* ## DatabaseApiKeyService
|
|
24
|
+
*
|
|
25
|
+
* Application service responsible for issuing, listing and revoking
|
|
26
|
+
* database-backed API keys.
|
|
27
|
+
*
|
|
28
|
+
* Responsibilities:
|
|
29
|
+
* - issue API keys for active users
|
|
30
|
+
* - list API keys owned by a user
|
|
31
|
+
* - revoke existing API keys
|
|
32
|
+
* - publish API key lifecycle audit events
|
|
33
|
+
*
|
|
34
|
+
* Guarantees:
|
|
35
|
+
* - only active users can receive new API keys
|
|
36
|
+
* - API keys are persisted atomically using database transactions
|
|
37
|
+
* - plaintext API keys are returned only during creation
|
|
38
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
39
|
+
*
|
|
40
|
+
* Non-responsibilities:
|
|
41
|
+
* - API key authentication
|
|
42
|
+
* - API key hash verification
|
|
43
|
+
* - authorization policy evaluation
|
|
44
|
+
* - HTTP request handling
|
|
45
|
+
*/
|
|
22
46
|
export class DatabaseApiKeyService {
|
|
47
|
+
/**
|
|
48
|
+
* Creates a new database-backed API key management service.
|
|
49
|
+
*
|
|
50
|
+
* @param db Database abstraction used for persistence.
|
|
51
|
+
* @param hasher Hashing strategy used before storing API keys.
|
|
52
|
+
* @param tables Optional table name overrides.
|
|
53
|
+
* @param events Optional authentication audit event sink.
|
|
54
|
+
* @param now Clock provider used for timestamps and testing.
|
|
55
|
+
*/
|
|
23
56
|
constructor(db, hasher, tables = {}, events, now = () => new Date()) {
|
|
24
57
|
this.db = db;
|
|
25
58
|
this.hasher = hasher;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-api-key-service.js","sourceRoot":"","sources":["../src/database-api-key-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"database-api-key-service.js","sourceRoot":"","sources":["../src/database-api-key-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,34 @@
|
|
|
1
1
|
import type { ApiKeyUsageRecorder } from '@kurdel/auth';
|
|
2
2
|
import type { Database } from '@kurdel/db';
|
|
3
3
|
import { type AuthDatabaseTables } from './auth-database-tables.js';
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* ## DatabaseApiKeyUsageRecorder
|
|
6
|
+
*
|
|
7
|
+
* Database-backed recorder for API key usage.
|
|
8
|
+
*
|
|
9
|
+
* Responsibilities:
|
|
10
|
+
* - record the most recent successful use of an API key
|
|
11
|
+
* - isolate API key usage persistence from the underlying database schema
|
|
12
|
+
*
|
|
13
|
+
* Guarantees:
|
|
14
|
+
* - updates only the API key usage timestamp
|
|
15
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
16
|
+
*
|
|
17
|
+
* Non-responsibilities:
|
|
18
|
+
* - API key validation
|
|
19
|
+
* - authentication
|
|
20
|
+
* - audit event persistence
|
|
21
|
+
* - HTTP request handling
|
|
22
|
+
*/
|
|
5
23
|
export declare class DatabaseApiKeyUsageRecorder implements ApiKeyUsageRecorder {
|
|
6
24
|
private readonly db;
|
|
7
25
|
private readonly tables;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a new database-backed API key usage recorder.
|
|
28
|
+
*
|
|
29
|
+
* @param db Database abstraction used for persistence.
|
|
30
|
+
* @param tables Optional table name overrides.
|
|
31
|
+
*/
|
|
8
32
|
constructor(db: Database, tables?: Partial<AuthDatabaseTables>);
|
|
9
33
|
recordUsage(credentialId: string, usedAt: Date): Promise<void>;
|
|
10
34
|
}
|
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import { resolveAuthDatabaseTables } from './auth-database-tables.js';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* ## DatabaseApiKeyUsageRecorder
|
|
4
|
+
*
|
|
5
|
+
* Database-backed recorder for API key usage.
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* - record the most recent successful use of an API key
|
|
9
|
+
* - isolate API key usage persistence from the underlying database schema
|
|
10
|
+
*
|
|
11
|
+
* Guarantees:
|
|
12
|
+
* - updates only the API key usage timestamp
|
|
13
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
14
|
+
*
|
|
15
|
+
* Non-responsibilities:
|
|
16
|
+
* - API key validation
|
|
17
|
+
* - authentication
|
|
18
|
+
* - audit event persistence
|
|
19
|
+
* - HTTP request handling
|
|
20
|
+
*/
|
|
3
21
|
export class DatabaseApiKeyUsageRecorder {
|
|
22
|
+
/**
|
|
23
|
+
* Creates a new database-backed API key usage recorder.
|
|
24
|
+
*
|
|
25
|
+
* @param db Database abstraction used for persistence.
|
|
26
|
+
* @param tables Optional table name overrides.
|
|
27
|
+
*/
|
|
4
28
|
constructor(db, tables = {}) {
|
|
5
29
|
this.db = db;
|
|
6
30
|
this.tables = resolveAuthDatabaseTables(tables);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-api-key-usage-recorder.js","sourceRoot":"","sources":["../src/database-api-key-usage-recorder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAE/F
|
|
1
|
+
{"version":3,"file":"database-api-key-usage-recorder.js","sourceRoot":"","sources":["../src/database-api-key-usage-recorder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAE/F;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,2BAA2B;IAGtC;;;;;OAKG;IACH,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,MAAY;QAClD,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAChB,GAAG,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,OAAO,qCAAqC;YACvE,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AuthEventSinkProvider } from '@kurdel/auth';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the database-backed authentication event sink for `AuthModule`.
|
|
4
|
+
*
|
|
5
|
+
* `AuthDatabaseModule` must be configured with `audit: true` so that the
|
|
6
|
+
* event store is registered in the application container.
|
|
7
|
+
*/
|
|
8
|
+
export declare function databaseAuthEventSink(): AuthEventSinkProvider;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AUTH_DB_TOKENS } from './tokens.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the database-backed authentication event sink for `AuthModule`.
|
|
4
|
+
*
|
|
5
|
+
* `AuthDatabaseModule` must be configured with `audit: true` so that the
|
|
6
|
+
* event store is registered in the application container.
|
|
7
|
+
*/
|
|
8
|
+
export function databaseAuthEventSink() {
|
|
9
|
+
return {
|
|
10
|
+
useFactory(container) {
|
|
11
|
+
return container.get(AUTH_DB_TOKENS.EventStore);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=database-auth-event-sink-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-auth-event-sink-provider.js","sourceRoot":"","sources":["../src/database-auth-event-sink-provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,UAAU,CAAC,SAAoB;YAC7B,OAAO,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -26,10 +26,37 @@ export type AuthEventList = {
|
|
|
26
26
|
limit: number;
|
|
27
27
|
offset: number;
|
|
28
28
|
};
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* ## DatabaseAuthEventStore
|
|
31
|
+
*
|
|
32
|
+
* Database-backed store for authentication audit events.
|
|
33
|
+
*
|
|
34
|
+
* Responsibilities:
|
|
35
|
+
* - persist authentication audit events
|
|
36
|
+
* - provide filtered and paginated audit queries
|
|
37
|
+
* - map database records to audit event DTOs
|
|
38
|
+
* - isolate audit persistence from the underlying database schema
|
|
39
|
+
*
|
|
40
|
+
* Guarantees:
|
|
41
|
+
* - stores sanitized authentication events only
|
|
42
|
+
* - supports transactional event persistence
|
|
43
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
44
|
+
*
|
|
45
|
+
* Non-responsibilities:
|
|
46
|
+
* - authentication
|
|
47
|
+
* - authorization policy evaluation
|
|
48
|
+
* - event dispatching
|
|
49
|
+
* - HTTP request handling
|
|
50
|
+
*/
|
|
30
51
|
export declare class DatabaseAuthEventStore implements AuthEventSink {
|
|
31
52
|
private readonly db;
|
|
32
53
|
private readonly tables;
|
|
54
|
+
/**
|
|
55
|
+
* Creates a new database-backed authentication audit store.
|
|
56
|
+
*
|
|
57
|
+
* @param db Database abstraction used for persistence.
|
|
58
|
+
* @param tables Optional table name overrides.
|
|
59
|
+
*/
|
|
33
60
|
constructor(db: Database, tables?: Partial<AuthDatabaseTables>);
|
|
34
61
|
report(event: AuthEvent, database?: DatabaseSession): Promise<void>;
|
|
35
62
|
list(input?: ListAuthEventsInput): Promise<StoredAuthEvent[]>;
|
|
@@ -1,10 +1,40 @@
|
|
|
1
1
|
import { resolveAuthDatabaseTables } from './auth-database-tables.js';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* ## DatabaseAuthEventStore
|
|
4
|
+
*
|
|
5
|
+
* Database-backed store for authentication audit events.
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* - persist authentication audit events
|
|
9
|
+
* - provide filtered and paginated audit queries
|
|
10
|
+
* - map database records to audit event DTOs
|
|
11
|
+
* - isolate audit persistence from the underlying database schema
|
|
12
|
+
*
|
|
13
|
+
* Guarantees:
|
|
14
|
+
* - stores sanitized authentication events only
|
|
15
|
+
* - supports transactional event persistence
|
|
16
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
17
|
+
*
|
|
18
|
+
* Non-responsibilities:
|
|
19
|
+
* - authentication
|
|
20
|
+
* - authorization policy evaluation
|
|
21
|
+
* - event dispatching
|
|
22
|
+
* - HTTP request handling
|
|
23
|
+
*/
|
|
3
24
|
export class DatabaseAuthEventStore {
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new database-backed authentication audit store.
|
|
27
|
+
*
|
|
28
|
+
* @param db Database abstraction used for persistence.
|
|
29
|
+
* @param tables Optional table name overrides.
|
|
30
|
+
*/
|
|
4
31
|
constructor(db, tables = {}) {
|
|
5
32
|
this.db = db;
|
|
6
33
|
this.tables = resolveAuthDatabaseTables(tables);
|
|
7
34
|
}
|
|
35
|
+
// ---------------------------------------------------------------------
|
|
36
|
+
// Event persistence
|
|
37
|
+
// ---------------------------------------------------------------------
|
|
8
38
|
async report(event, database = this.db) {
|
|
9
39
|
await database.run({
|
|
10
40
|
sql: [
|
|
@@ -24,6 +54,9 @@ export class DatabaseAuthEventStore {
|
|
|
24
54
|
],
|
|
25
55
|
});
|
|
26
56
|
}
|
|
57
|
+
// ---------------------------------------------------------------------
|
|
58
|
+
// Event queries
|
|
59
|
+
// ---------------------------------------------------------------------
|
|
27
60
|
async list(input = {}) {
|
|
28
61
|
return (await this.listPage(input)).events;
|
|
29
62
|
}
|
|
@@ -79,6 +112,9 @@ export class DatabaseAuthEventStore {
|
|
|
79
112
|
offset,
|
|
80
113
|
};
|
|
81
114
|
}
|
|
115
|
+
// ---------------------------------------------------------------------
|
|
116
|
+
// Utilities
|
|
117
|
+
// ---------------------------------------------------------------------
|
|
82
118
|
serializeDate(value) {
|
|
83
119
|
return value instanceof Date ? value.toISOString() : value;
|
|
84
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-auth-event-store.js","sourceRoot":"","sources":["../src/database-auth-event-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AA0C/F
|
|
1
|
+
{"version":3,"file":"database-auth-event-store.js","sourceRoot":"","sources":["../src/database-auth-event-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,37 @@ import type { AuthUserRepository } from '@kurdel/auth';
|
|
|
2
2
|
import type { AuthUser } from '@kurdel/common';
|
|
3
3
|
import type { Database } from '@kurdel/db';
|
|
4
4
|
import { type AuthDatabaseTables } from './auth-database-tables.js';
|
|
5
|
+
/**
|
|
6
|
+
* ## DatabaseAuthUserRepository
|
|
7
|
+
*
|
|
8
|
+
* Database-backed repository for authenticated users.
|
|
9
|
+
*
|
|
10
|
+
* Responsibilities:
|
|
11
|
+
* - resolve authenticated users by identifier
|
|
12
|
+
* - load user roles and effective permissions
|
|
13
|
+
* - map database records to `AuthUser`
|
|
14
|
+
* - isolate authentication from the underlying database schema
|
|
15
|
+
*
|
|
16
|
+
* Guarantees:
|
|
17
|
+
* - returns `null` for missing or inactive users
|
|
18
|
+
* - resolves effective permissions from assigned roles
|
|
19
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
20
|
+
*
|
|
21
|
+
* Non-responsibilities:
|
|
22
|
+
* - user management
|
|
23
|
+
* - role or permission management
|
|
24
|
+
* - authentication workflows
|
|
25
|
+
* - HTTP request handling
|
|
26
|
+
*/
|
|
5
27
|
export declare class DatabaseAuthUserRepository implements AuthUserRepository {
|
|
6
28
|
private readonly db;
|
|
7
29
|
private readonly tables;
|
|
30
|
+
/**
|
|
31
|
+
* Creates a new database-backed authenticated user repository.
|
|
32
|
+
*
|
|
33
|
+
* @param db Database abstraction used for persistence.
|
|
34
|
+
* @param tables Optional table name overrides.
|
|
35
|
+
*/
|
|
8
36
|
constructor(db: Database, tables?: Partial<AuthDatabaseTables>);
|
|
9
37
|
findById(id: string | number): Promise<AuthUser | null>;
|
|
10
38
|
}
|
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
import { resolveAuthDatabaseTables } from './auth-database-tables.js';
|
|
2
|
+
/**
|
|
3
|
+
* ## DatabaseAuthUserRepository
|
|
4
|
+
*
|
|
5
|
+
* Database-backed repository for authenticated users.
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* - resolve authenticated users by identifier
|
|
9
|
+
* - load user roles and effective permissions
|
|
10
|
+
* - map database records to `AuthUser`
|
|
11
|
+
* - isolate authentication from the underlying database schema
|
|
12
|
+
*
|
|
13
|
+
* Guarantees:
|
|
14
|
+
* - returns `null` for missing or inactive users
|
|
15
|
+
* - resolves effective permissions from assigned roles
|
|
16
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
17
|
+
*
|
|
18
|
+
* Non-responsibilities:
|
|
19
|
+
* - user management
|
|
20
|
+
* - role or permission management
|
|
21
|
+
* - authentication workflows
|
|
22
|
+
* - HTTP request handling
|
|
23
|
+
*/
|
|
2
24
|
export class DatabaseAuthUserRepository {
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new database-backed authenticated user repository.
|
|
27
|
+
*
|
|
28
|
+
* @param db Database abstraction used for persistence.
|
|
29
|
+
* @param tables Optional table name overrides.
|
|
30
|
+
*/
|
|
3
31
|
constructor(db, tables = {}) {
|
|
4
32
|
this.db = db;
|
|
5
33
|
this.tables = resolveAuthDatabaseTables(tables);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-auth-user-repository.js","sourceRoot":"","sources":["../src/database-auth-user-repository.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAM/F,MAAM,OAAO,0BAA0B;IAGrC,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAmB;QAChC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC9B,GAAG,EAAE,0BAA0B,IAAI,CAAC,MAAM,CAAC,KAAK,gBAAgB;YAChE,MAAM,EAAE,CAAC,EAAE,CAAC;SACb,CAAC,CAA2B,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEnD,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC/B,GAAG,EAAE;gBACH,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO;gBAClC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC3B,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACrC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK;gBAC/D,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc;gBAC5C,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ;aACtC,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAClB,CAAC,CAAiB,CAAC;QAEpB,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YACrC,GAAG,EAAE;gBACH,mBAAmB,IAAI,CAAC,MAAM,CAAC,WAAW,OAAO;gBACjD,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACjC,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;gBAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,oBAAoB,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK;gBACjF,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACrC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,UAAU;gBAC9E,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc;gBAC5C,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW,QAAQ;aAC5C,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAClB,CAAC,CAAuB,CAAC;QAE1B,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"database-auth-user-repository.js","sourceRoot":"","sources":["../src/database-auth-user-repository.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAM/F;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,0BAA0B;IAGrC;;;;;OAKG;IACH,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAmB;QAChC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC9B,GAAG,EAAE,0BAA0B,IAAI,CAAC,MAAM,CAAC,KAAK,gBAAgB;YAChE,MAAM,EAAE,CAAC,EAAE,CAAC;SACb,CAAC,CAA2B,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEnD,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC/B,GAAG,EAAE;gBACH,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO;gBAClC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC3B,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACrC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK;gBAC/D,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc;gBAC5C,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ;aACtC,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAClB,CAAC,CAAiB,CAAC;QAEpB,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YACrC,GAAG,EAAE;gBACH,mBAAmB,IAAI,CAAC,MAAM,CAAC,WAAW,OAAO;gBACjD,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACjC,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;gBAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,oBAAoB,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK;gBACjF,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACrC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,UAAU;gBAC9E,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc;gBAC5C,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW,QAAQ;aAC5C,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAClB,CAAC,CAAuB,CAAC;QAE1B,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,10 +1,36 @@
|
|
|
1
1
|
import type { JwtSession, JwtSessionRepository } from '@kurdel/auth';
|
|
2
2
|
import type { Database } from '@kurdel/db';
|
|
3
3
|
import { type AuthDatabaseTables } from './auth-database-tables.js';
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* ## DatabaseJwtSessionRepository
|
|
6
|
+
*
|
|
7
|
+
* Database-backed repository for persisted JWT sessions.
|
|
8
|
+
*
|
|
9
|
+
* Responsibilities:
|
|
10
|
+
* - resolve JWT sessions by identifier
|
|
11
|
+
* - map database records to `JwtSession`
|
|
12
|
+
* - isolate JWT validation from the underlying database schema
|
|
13
|
+
*
|
|
14
|
+
* Guarantees:
|
|
15
|
+
* - returns `null` when the session does not exist
|
|
16
|
+
* - exposes session revocation and expiration state
|
|
17
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
18
|
+
*
|
|
19
|
+
* Non-responsibilities:
|
|
20
|
+
* - session creation or revocation
|
|
21
|
+
* - refresh token management
|
|
22
|
+
* - JWT signing or verification
|
|
23
|
+
* - HTTP request handling
|
|
24
|
+
*/
|
|
5
25
|
export declare class DatabaseJwtSessionRepository implements JwtSessionRepository {
|
|
6
26
|
private readonly db;
|
|
7
27
|
private readonly tables;
|
|
28
|
+
/**
|
|
29
|
+
* Creates a new database-backed JWT session repository.
|
|
30
|
+
*
|
|
31
|
+
* @param db Database abstraction used for persistence.
|
|
32
|
+
* @param tables Optional table name overrides.
|
|
33
|
+
*/
|
|
8
34
|
constructor(db: Database, tables?: Partial<AuthDatabaseTables>);
|
|
9
35
|
findById(id: string): Promise<JwtSession | null>;
|
|
10
36
|
}
|
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
import { resolveAuthDatabaseTables } from './auth-database-tables.js';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* ## DatabaseJwtSessionRepository
|
|
4
|
+
*
|
|
5
|
+
* Database-backed repository for persisted JWT sessions.
|
|
6
|
+
*
|
|
7
|
+
* Responsibilities:
|
|
8
|
+
* - resolve JWT sessions by identifier
|
|
9
|
+
* - map database records to `JwtSession`
|
|
10
|
+
* - isolate JWT validation from the underlying database schema
|
|
11
|
+
*
|
|
12
|
+
* Guarantees:
|
|
13
|
+
* - returns `null` when the session does not exist
|
|
14
|
+
* - exposes session revocation and expiration state
|
|
15
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
16
|
+
*
|
|
17
|
+
* Non-responsibilities:
|
|
18
|
+
* - session creation or revocation
|
|
19
|
+
* - refresh token management
|
|
20
|
+
* - JWT signing or verification
|
|
21
|
+
* - HTTP request handling
|
|
22
|
+
*/
|
|
3
23
|
export class DatabaseJwtSessionRepository {
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new database-backed JWT session repository.
|
|
26
|
+
*
|
|
27
|
+
* @param db Database abstraction used for persistence.
|
|
28
|
+
* @param tables Optional table name overrides.
|
|
29
|
+
*/
|
|
4
30
|
constructor(db, tables = {}) {
|
|
5
31
|
this.db = db;
|
|
6
32
|
this.tables = resolveAuthDatabaseTables(tables);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-jwt-session-repository.js","sourceRoot":"","sources":["../src/database-jwt-session-repository.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAS/F
|
|
1
|
+
{"version":3,"file":"database-jwt-session-repository.js","sourceRoot":"","sources":["../src/database-jwt-session-repository.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAS/F;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,4BAA4B;IAGvC;;;;;OAKG;IACH,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC/B,GAAG,EAAE;gBACH,wCAAwC;gBACxC,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,gBAAgB;aAChD,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,EAAE,CAAC;SACb,CAAiC,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM,EAAE,MAAM,CAAC,OAAO;YACtB,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ;YACnC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -9,6 +9,18 @@ export type CreatedJwtSession = {
|
|
|
9
9
|
userId: number;
|
|
10
10
|
expiresAt: string;
|
|
11
11
|
};
|
|
12
|
+
export type CreatedRefreshableJwtSession = CreatedJwtSession & {
|
|
13
|
+
refreshToken: string;
|
|
14
|
+
refreshExpiresAt: string;
|
|
15
|
+
};
|
|
16
|
+
export type RefreshedJwtSession = CreatedRefreshableJwtSession;
|
|
17
|
+
export type JwtSessionSummary = {
|
|
18
|
+
id: string;
|
|
19
|
+
userId: number;
|
|
20
|
+
status: 'active' | 'revoked' | 'expired';
|
|
21
|
+
expiresAt: string;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
};
|
|
12
24
|
export declare class JwtSessionNotFoundError extends Error {
|
|
13
25
|
readonly userId: number;
|
|
14
26
|
readonly sessionId: string;
|
|
@@ -18,14 +30,56 @@ export declare class ActiveJwtSessionUserNotFoundError extends Error {
|
|
|
18
30
|
readonly userId: number;
|
|
19
31
|
constructor(userId: number);
|
|
20
32
|
}
|
|
21
|
-
|
|
33
|
+
export declare class InvalidRefreshTokenError extends Error {
|
|
34
|
+
constructor();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* ## DatabaseJwtSessionService
|
|
38
|
+
*
|
|
39
|
+
* Application service responsible for managing persistent JWT sessions
|
|
40
|
+
* backed by a relational database through the `Database` abstraction.
|
|
41
|
+
*
|
|
42
|
+
* Responsibilities:
|
|
43
|
+
* - create server-side JWT sessions
|
|
44
|
+
* - issue and rotate refresh tokens
|
|
45
|
+
* - list active and historical sessions
|
|
46
|
+
* - revoke individual or all user sessions
|
|
47
|
+
* - emit JWT session audit events
|
|
48
|
+
*
|
|
49
|
+
* Guarantees:
|
|
50
|
+
* - validates that sessions belong to active users
|
|
51
|
+
* - stores refresh tokens as SHA-256 hashes only
|
|
52
|
+
* - rotates refresh tokens atomically
|
|
53
|
+
* - performs all state changes inside database transactions
|
|
54
|
+
* - remains database-agnostic (SQLite/PostgreSQL)
|
|
55
|
+
*
|
|
56
|
+
* Non-responsibilities:
|
|
57
|
+
* - JWT signing or verification
|
|
58
|
+
* - access token generation
|
|
59
|
+
* - authorization policy evaluation
|
|
60
|
+
* - HTTP request handling
|
|
61
|
+
*/
|
|
22
62
|
export declare class DatabaseJwtSessionService {
|
|
23
63
|
private readonly db;
|
|
24
64
|
private readonly events?;
|
|
25
65
|
private readonly now;
|
|
26
66
|
private readonly tables;
|
|
67
|
+
/**
|
|
68
|
+
* Creates a new database-backed JWT session service.
|
|
69
|
+
*
|
|
70
|
+
* @param db Database abstraction used for persistence.
|
|
71
|
+
* @param tables Optional table name overrides.
|
|
72
|
+
* @param events Optional transactional audit event sink.
|
|
73
|
+
* @param now Time provider used for expiration checks and timestamps.
|
|
74
|
+
*/
|
|
27
75
|
constructor(db: Database, tables?: Partial<AuthDatabaseTables>, events?: TransactionalAuthEventSink | undefined, now?: () => Date);
|
|
28
76
|
create(userId: number, expiresAt: Date): Promise<CreatedJwtSession>;
|
|
77
|
+
createRefreshable(userId: number, refreshExpiresAt: Date): Promise<CreatedRefreshableJwtSession>;
|
|
78
|
+
refresh(refreshToken: string): Promise<RefreshedJwtSession>;
|
|
79
|
+
list(userId: number): Promise<JwtSessionSummary[]>;
|
|
80
|
+
revokeAll(userId: number): Promise<void>;
|
|
29
81
|
revoke(userId: number, sessionId: string): Promise<void>;
|
|
82
|
+
private generateRefreshToken;
|
|
83
|
+
private hashRefreshToken;
|
|
30
84
|
}
|
|
31
85
|
export {};
|