@warlock.js/auth 4.0.5 → 4.0.10
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/cjs/commands/auth-cleanup-command.d.ts +10 -0
- package/cjs/commands/auth-cleanup-command.d.ts.map +1 -0
- package/cjs/commands/auth-cleanup-command.js +29 -0
- package/cjs/commands/auth-cleanup-command.js.map +1 -0
- package/cjs/commands/jwt-secret-generator-command.d.ts.map +1 -1
- package/cjs/commands/jwt-secret-generator-command.js +5 -1
- package/cjs/commands/jwt-secret-generator-command.js.map +1 -1
- package/cjs/contracts/types.d.ts +100 -1
- package/cjs/contracts/types.d.ts.map +1 -1
- package/cjs/contracts/types.js +20 -0
- package/cjs/contracts/types.js.map +1 -0
- package/cjs/index.d.ts +2 -1
- package/cjs/index.d.ts.map +1 -1
- package/cjs/index.js +1 -1
- package/cjs/middleware/auth.middleware.d.ts.map +1 -1
- package/cjs/middleware/auth.middleware.js +14 -37
- package/cjs/middleware/auth.middleware.js.map +1 -1
- package/cjs/models/auth.d.ts +24 -2
- package/cjs/models/auth.d.ts.map +1 -1
- package/cjs/models/auth.js +39 -40
- package/cjs/models/auth.js.map +1 -1
- package/cjs/models/casts/cast-password.d.ts.map +1 -1
- package/cjs/models/casts/cast-password.js +2 -2
- package/cjs/models/casts/cast-password.js.map +1 -1
- package/cjs/models/index.d.ts +1 -1
- package/cjs/models/index.d.ts.map +1 -1
- package/cjs/models/refresh-token/index.d.ts +2 -0
- package/cjs/models/refresh-token/index.d.ts.map +1 -0
- package/cjs/models/refresh-token/migration.d.ts.map +1 -0
- package/cjs/models/refresh-token/refresh-token.d.ts +32 -0
- package/cjs/models/refresh-token/refresh-token.d.ts.map +1 -0
- package/cjs/models/refresh-token/refresh-token.js +52 -0
- package/cjs/models/refresh-token/refresh-token.js.map +1 -0
- package/cjs/services/auth-events.d.ts +84 -0
- package/cjs/services/auth-events.d.ts.map +1 -0
- package/cjs/services/auth-events.js +65 -0
- package/cjs/services/auth-events.js.map +1 -0
- package/cjs/services/auth.service.d.ts +78 -0
- package/cjs/services/auth.service.d.ts.map +1 -0
- package/cjs/services/auth.service.js +265 -0
- package/cjs/services/auth.service.js.map +1 -0
- package/cjs/services/generate-jwt-secret.d.ts.map +1 -1
- package/cjs/services/generate-jwt-secret.js +4 -4
- package/cjs/services/generate-jwt-secret.js.map +1 -1
- package/cjs/services/index.d.ts +2 -1
- package/cjs/services/index.d.ts.map +1 -1
- package/cjs/services/jwt.d.ts +2 -2
- package/cjs/services/jwt.d.ts.map +1 -1
- package/cjs/services/jwt.js +4 -4
- package/cjs/services/jwt.js.map +1 -1
- package/cjs/utils/auth-error-codes.d.ts +18 -0
- package/cjs/utils/auth-error-codes.d.ts.map +1 -0
- package/cjs/utils/auth-error-codes.js +18 -0
- package/cjs/utils/auth-error-codes.js.map +1 -0
- package/cjs/utils/duration.d.ts +45 -0
- package/cjs/utils/duration.d.ts.map +1 -0
- package/cjs/utils/duration.js +93 -0
- package/cjs/utils/duration.js.map +1 -0
- package/cjs/utils/index.d.ts +3 -0
- package/cjs/utils/index.d.ts.map +1 -0
- package/esm/commands/auth-cleanup-command.d.ts +10 -0
- package/esm/commands/auth-cleanup-command.d.ts.map +1 -0
- package/esm/commands/auth-cleanup-command.js +29 -0
- package/esm/commands/auth-cleanup-command.js.map +1 -0
- package/esm/commands/jwt-secret-generator-command.d.ts.map +1 -1
- package/esm/commands/jwt-secret-generator-command.js +5 -1
- package/esm/commands/jwt-secret-generator-command.js.map +1 -1
- package/esm/contracts/types.d.ts +100 -1
- package/esm/contracts/types.d.ts.map +1 -1
- package/esm/contracts/types.js +20 -0
- package/esm/contracts/types.js.map +1 -0
- package/esm/index.d.ts +2 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -1
- package/esm/middleware/auth.middleware.d.ts.map +1 -1
- package/esm/middleware/auth.middleware.js +14 -37
- package/esm/middleware/auth.middleware.js.map +1 -1
- package/esm/models/auth.d.ts +24 -2
- package/esm/models/auth.d.ts.map +1 -1
- package/esm/models/auth.js +38 -39
- package/esm/models/auth.js.map +1 -1
- package/esm/models/casts/cast-password.d.ts.map +1 -1
- package/esm/models/casts/cast-password.js +2 -2
- package/esm/models/casts/cast-password.js.map +1 -1
- package/esm/models/index.d.ts +1 -1
- package/esm/models/index.d.ts.map +1 -1
- package/esm/models/refresh-token/index.d.ts +2 -0
- package/esm/models/refresh-token/index.d.ts.map +1 -0
- package/esm/models/refresh-token/migration.d.ts.map +1 -0
- package/esm/models/refresh-token/refresh-token.d.ts +32 -0
- package/esm/models/refresh-token/refresh-token.d.ts.map +1 -0
- package/esm/models/refresh-token/refresh-token.js +52 -0
- package/esm/models/refresh-token/refresh-token.js.map +1 -0
- package/esm/services/auth-events.d.ts +84 -0
- package/esm/services/auth-events.d.ts.map +1 -0
- package/esm/services/auth-events.js +65 -0
- package/esm/services/auth-events.js.map +1 -0
- package/esm/services/auth.service.d.ts +78 -0
- package/esm/services/auth.service.d.ts.map +1 -0
- package/esm/services/auth.service.js +265 -0
- package/esm/services/auth.service.js.map +1 -0
- package/esm/services/generate-jwt-secret.d.ts.map +1 -1
- package/esm/services/generate-jwt-secret.js +5 -5
- package/esm/services/generate-jwt-secret.js.map +1 -1
- package/esm/services/index.d.ts +2 -1
- package/esm/services/index.d.ts.map +1 -1
- package/esm/services/jwt.d.ts +2 -2
- package/esm/services/jwt.d.ts.map +1 -1
- package/esm/services/jwt.js +4 -4
- package/esm/services/jwt.js.map +1 -1
- package/esm/utils/auth-error-codes.d.ts +18 -0
- package/esm/utils/auth-error-codes.d.ts.map +1 -0
- package/esm/utils/auth-error-codes.js +18 -0
- package/esm/utils/auth-error-codes.js.map +1 -0
- package/esm/utils/duration.d.ts +45 -0
- package/esm/utils/duration.d.ts.map +1 -0
- package/esm/utils/duration.js +93 -0
- package/esm/utils/duration.js.map +1 -0
- package/esm/utils/index.d.ts +3 -0
- package/esm/utils/index.d.ts.map +1 -0
- package/package.json +12 -9
- package/cjs/commands/index.d.ts +0 -2
- package/cjs/commands/index.d.ts.map +0 -1
- package/cjs/controllers/guest-login.d.ts +0 -3
- package/cjs/controllers/guest-login.d.ts.map +0 -1
- package/cjs/controllers/guest-login.js +0 -5
- package/cjs/controllers/guest-login.js.map +0 -1
- package/cjs/controllers/index.d.ts +0 -2
- package/cjs/controllers/index.d.ts.map +0 -1
- package/cjs/middleware/auth-middleware.d.ts +0 -2
- package/cjs/middleware/auth-middleware.d.ts.map +0 -1
- package/cjs/models/guest/guest.d.ts +0 -26
- package/cjs/models/guest/guest.d.ts.map +0 -1
- package/cjs/models/guest/guest.js +0 -39
- package/cjs/models/guest/guest.js.map +0 -1
- package/cjs/models/guest/index.d.ts +0 -3
- package/cjs/models/guest/index.d.ts.map +0 -1
- package/cjs/models/guest/migration.d.ts.map +0 -1
- package/cjs/models/guest/migration.js +0 -10
- package/cjs/models/guest/migration.js.map +0 -1
- package/cjs/services/generate-guest-token.d.ts +0 -2
- package/cjs/services/generate-guest-token.d.ts.map +0 -1
- package/cjs/services/generate-guest-token.js +0 -11
- package/cjs/services/generate-guest-token.js.map +0 -1
- package/esm/commands/index.d.ts +0 -2
- package/esm/commands/index.d.ts.map +0 -1
- package/esm/controllers/guest-login.d.ts +0 -3
- package/esm/controllers/guest-login.d.ts.map +0 -1
- package/esm/controllers/guest-login.js +0 -5
- package/esm/controllers/guest-login.js.map +0 -1
- package/esm/controllers/index.d.ts +0 -2
- package/esm/controllers/index.d.ts.map +0 -1
- package/esm/middleware/auth-middleware.d.ts +0 -2
- package/esm/middleware/auth-middleware.d.ts.map +0 -1
- package/esm/models/guest/guest.d.ts +0 -26
- package/esm/models/guest/guest.d.ts.map +0 -1
- package/esm/models/guest/guest.js +0 -39
- package/esm/models/guest/guest.js.map +0 -1
- package/esm/models/guest/index.d.ts +0 -3
- package/esm/models/guest/index.d.ts.map +0 -1
- package/esm/models/guest/migration.d.ts.map +0 -1
- package/esm/models/guest/migration.js +0 -10
- package/esm/models/guest/migration.js.map +0 -1
- package/esm/services/generate-guest-token.d.ts +0 -2
- package/esm/services/generate-guest-token.d.ts.map +0 -1
- package/esm/services/generate-guest-token.js +0 -11
- package/esm/services/generate-guest-token.js.map +0 -1
- /package/cjs/models/{guest → refresh-token}/migration.d.ts +0 -0
- /package/esm/models/{guest → refresh-token}/migration.d.ts +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';var cascade=require('@warlock.js/cascade');class RefreshToken extends cascade.Model {
|
|
2
|
+
/**
|
|
3
|
+
* {@inheritDoc}
|
|
4
|
+
*/
|
|
5
|
+
static collection = "refreshTokens";
|
|
6
|
+
/**
|
|
7
|
+
* {@inheritDoc}
|
|
8
|
+
*/
|
|
9
|
+
casts = {
|
|
10
|
+
token: "string",
|
|
11
|
+
userId: "int",
|
|
12
|
+
userType: "string",
|
|
13
|
+
familyId: "string",
|
|
14
|
+
expiresAt: "date",
|
|
15
|
+
lastUsedAt: "date",
|
|
16
|
+
revokedAt: "date",
|
|
17
|
+
deviceInfo: "object",
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Check if token is expired
|
|
21
|
+
*/
|
|
22
|
+
get isExpired() {
|
|
23
|
+
const expiresAt = this.get("expiresAt");
|
|
24
|
+
if (!expiresAt)
|
|
25
|
+
return false;
|
|
26
|
+
return new Date() > new Date(expiresAt);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if token is revoked
|
|
30
|
+
*/
|
|
31
|
+
get isRevoked() {
|
|
32
|
+
return !!this.get("revokedAt");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if token is valid (not expired and not revoked)
|
|
36
|
+
*/
|
|
37
|
+
get isValid() {
|
|
38
|
+
return !this.isExpired && !this.isRevoked;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Revoke this token
|
|
42
|
+
*/
|
|
43
|
+
async revoke() {
|
|
44
|
+
return this.save({ revokedAt: new Date() });
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Mark token as used (update lastUsedAt)
|
|
48
|
+
*/
|
|
49
|
+
async markAsUsed() {
|
|
50
|
+
this.silentSaving({ lastUsedAt: new Date() });
|
|
51
|
+
}
|
|
52
|
+
}exports.RefreshToken=RefreshToken;//# sourceMappingURL=refresh-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-token.js","sources":["../../../src/models/refresh-token/refresh-token.ts"],"sourcesContent":[null],"names":["Model"],"mappings":"wDAEM,MAAO,YAAa,SAAQA,aAAK,CAAA;AACrC;;AAEG;AACI,IAAA,OAAO,UAAU,GAAG,eAAe,CAAC;AAE3C;;AAEG;AACO,IAAA,KAAK,GAAU;AACvB,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,SAAS,EAAE,MAAM;AACjB,QAAA,UAAU,EAAE,MAAM;AAClB,QAAA,SAAS,EAAE,MAAM;AACjB,QAAA,UAAU,EAAE,QAAQ;KACrB,CAAC;AAEF;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,KAAK,CAAC;QAC7B,OAAO,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;KACzC;AAED;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;KAChC;AAED;;AAEG;AACH,IAAA,IAAW,OAAO,GAAA;QAChB,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;KAC3C;AAED;;AAEG;AACI,IAAA,MAAM,MAAM,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;KAC7C;AAED;;AAEG;AACI,IAAA,MAAM,UAAU,GAAA;QACrB,IAAI,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;KAC/C;"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type EventSubscription } from "@mongez/events";
|
|
2
|
+
import type { DeviceInfo, TokenPair } from "../contracts/types";
|
|
3
|
+
import type { Auth } from "../models/auth";
|
|
4
|
+
import type { RefreshToken } from "../models/refresh-token";
|
|
5
|
+
/**
|
|
6
|
+
* Auth event payload types
|
|
7
|
+
*/
|
|
8
|
+
export type AuthEventPayloads = {
|
|
9
|
+
"login.success": [user: Auth, tokenPair: TokenPair, deviceInfo?: DeviceInfo];
|
|
10
|
+
"login.failed": [credentials: {
|
|
11
|
+
email?: string;
|
|
12
|
+
username?: string;
|
|
13
|
+
}, reason: string];
|
|
14
|
+
"login.attempt": [credentials: {
|
|
15
|
+
email?: string;
|
|
16
|
+
username?: string;
|
|
17
|
+
}];
|
|
18
|
+
logout: [user: Auth];
|
|
19
|
+
"logout.all": [user: Auth];
|
|
20
|
+
"token.created": [user: Auth, tokenPair: TokenPair];
|
|
21
|
+
"token.refreshed": [user: Auth, newTokenPair: TokenPair, oldRefreshToken: RefreshToken];
|
|
22
|
+
"token.revoked": [user: Auth, token: RefreshToken];
|
|
23
|
+
"token.expired": [token: RefreshToken];
|
|
24
|
+
"token.familyRevoked": [familyId: string, tokens: RefreshToken[]];
|
|
25
|
+
"password.changed": [user: Auth];
|
|
26
|
+
"password.resetRequested": [user: Auth, resetToken: string];
|
|
27
|
+
"password.reset": [user: Auth];
|
|
28
|
+
"session.created": [user: Auth, refreshToken: RefreshToken, deviceInfo?: DeviceInfo];
|
|
29
|
+
"session.destroyed": [user: Auth, refreshToken: RefreshToken];
|
|
30
|
+
"cleanup.completed": [expiredCount: number];
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Auth event names
|
|
34
|
+
*/
|
|
35
|
+
export type AuthEventName = keyof AuthEventPayloads;
|
|
36
|
+
/**
|
|
37
|
+
* Callback type for a specific event
|
|
38
|
+
*/
|
|
39
|
+
export type AuthEventCallback<T extends AuthEventName> = (...args: AuthEventPayloads[T]) => void | Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Type-safe auth events manager
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* // Subscribe to events with full autocomplete
|
|
46
|
+
* authEvents.on("login.success", (user, tokenPair, deviceInfo) => {
|
|
47
|
+
* console.log(`User ${user.id} logged in`);
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* authEvents.on("token.refreshed", (user, newPair, oldToken) => {
|
|
51
|
+
* console.log(`Token refreshed for user ${user.id}`);
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* // Trigger events
|
|
55
|
+
* authEvents.emit("login.success", user, tokenPair, deviceInfo);
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare const authEvents: {
|
|
59
|
+
/**
|
|
60
|
+
* Subscribe to an auth event
|
|
61
|
+
*/
|
|
62
|
+
on<T extends keyof AuthEventPayloads>(event: T, callback: AuthEventCallback<T>): EventSubscription;
|
|
63
|
+
/**
|
|
64
|
+
* Subscribe to an auth event (alias for `on`)
|
|
65
|
+
*/
|
|
66
|
+
subscribe<T_1 extends keyof AuthEventPayloads>(event: T_1, callback: AuthEventCallback<T_1>): EventSubscription;
|
|
67
|
+
/**
|
|
68
|
+
* Emit an auth event
|
|
69
|
+
*/
|
|
70
|
+
emit<T_2 extends keyof AuthEventPayloads>(event: T_2, ...args: AuthEventPayloads[T_2]): void;
|
|
71
|
+
/**
|
|
72
|
+
* Emit an auth event (alias for `emit`)
|
|
73
|
+
*/
|
|
74
|
+
trigger<T_3 extends keyof AuthEventPayloads>(event: T_3, ...args: AuthEventPayloads[T_3]): void;
|
|
75
|
+
/**
|
|
76
|
+
* Unsubscribe from all auth events
|
|
77
|
+
*/
|
|
78
|
+
unsubscribeAll(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Unsubscribe from a specific auth event
|
|
81
|
+
*/
|
|
82
|
+
off(event?: AuthEventName): void;
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=auth-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-events.d.ts","sourceRoot":"","sources":["../../src/services/auth-events.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAE9B,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7E,cAAc,EAAE,CAAC,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrF,eAAe,EAAE,CAAC,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAGtE,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAG3B,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACpD,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IACxF,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACnD,eAAe,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACvC,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAGlE,kBAAkB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,yBAAyB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5D,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAG/B,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IACrF,mBAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAG9D,mBAAmB,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;CAC7C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,aAAa,IAAI,CACvD,GAAG,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAO1B;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU;IACrB;;OAEG;qFACoE,iBAAiB;IAIxF;;OAEG;kGAC2E,iBAAiB;IAI/F;;OAEG;4FACqE,IAAI;IAI5E;;OAEG;+FACwE,IAAI;IAI/E;;OAEG;sBACe,IAAI;IAItB;;OAEG;gBACS,aAAa,GAAG,IAAI;CAOjC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';var events=require('@mongez/events');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var events__default=/*#__PURE__*/_interopDefault(events);/**
|
|
2
|
+
* Event namespace prefix for auth events
|
|
3
|
+
*/
|
|
4
|
+
const AUTH_EVENT_PREFIX = "auth.";
|
|
5
|
+
/**
|
|
6
|
+
* Type-safe auth events manager
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // Subscribe to events with full autocomplete
|
|
11
|
+
* authEvents.on("login.success", (user, tokenPair, deviceInfo) => {
|
|
12
|
+
* console.log(`User ${user.id} logged in`);
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* authEvents.on("token.refreshed", (user, newPair, oldToken) => {
|
|
16
|
+
* console.log(`Token refreshed for user ${user.id}`);
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Trigger events
|
|
20
|
+
* authEvents.emit("login.success", user, tokenPair, deviceInfo);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
const authEvents = {
|
|
24
|
+
/**
|
|
25
|
+
* Subscribe to an auth event
|
|
26
|
+
*/
|
|
27
|
+
on(event, callback) {
|
|
28
|
+
return events__default.default.subscribe(AUTH_EVENT_PREFIX + event, callback);
|
|
29
|
+
},
|
|
30
|
+
/**
|
|
31
|
+
* Subscribe to an auth event (alias for `on`)
|
|
32
|
+
*/
|
|
33
|
+
subscribe(event, callback) {
|
|
34
|
+
return this.on(event, callback);
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* Emit an auth event
|
|
38
|
+
*/
|
|
39
|
+
emit(event, ...args) {
|
|
40
|
+
events__default.default.trigger(AUTH_EVENT_PREFIX + event, ...args);
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Emit an auth event (alias for `emit`)
|
|
44
|
+
*/
|
|
45
|
+
trigger(event, ...args) {
|
|
46
|
+
this.emit(event, ...args);
|
|
47
|
+
},
|
|
48
|
+
/**
|
|
49
|
+
* Unsubscribe from all auth events
|
|
50
|
+
*/
|
|
51
|
+
unsubscribeAll() {
|
|
52
|
+
events__default.default.unsubscribeNamespace(AUTH_EVENT_PREFIX.slice(0, -1));
|
|
53
|
+
},
|
|
54
|
+
/**
|
|
55
|
+
* Unsubscribe from a specific auth event
|
|
56
|
+
*/
|
|
57
|
+
off(event) {
|
|
58
|
+
if (event) {
|
|
59
|
+
events__default.default.unsubscribe(AUTH_EVENT_PREFIX + event);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
this.unsubscribeAll();
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
};exports.authEvents=authEvents;//# sourceMappingURL=auth-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-events.js","sources":["../../src/services/auth-events.ts"],"sourcesContent":[null],"names":["events"],"mappings":"4KAkDA;;AAEG;AACH,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAElC;;;;;;;;;;;;;;;;;AAiBG;AACU,MAAA,UAAU,GAAG;AACxB;;AAEG;IACH,EAAE,CAA0B,KAAQ,EAAE,QAA8B,EAAA;QAClE,OAAOA,uBAAM,CAAC,SAAS,CAAC,iBAAiB,GAAG,KAAK,EAAE,QAAoB,CAAC,CAAC;KAC1E;AAED;;AAEG;IACH,SAAS,CAA0B,KAAQ,EAAE,QAA8B,EAAA;QACzE,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;KACjC;AAED;;AAEG;AACH,IAAA,IAAI,CAA0B,KAAQ,EAAE,GAAG,IAA0B,EAAA;QACnEA,uBAAM,CAAC,OAAO,CAAC,iBAAiB,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;KACpD;AAED;;AAEG;AACH,IAAA,OAAO,CAA0B,KAAQ,EAAE,GAAG,IAA0B,EAAA;QACtE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;KAC3B;AAED;;AAEG;IACH,cAAc,GAAA;AACZ,QAAAA,uBAAM,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAC7D;AAED;;AAEG;AACH,IAAA,GAAG,CAAC,KAAqB,EAAA;AACvB,QAAA,IAAI,KAAK,EAAE;AACT,YAAAA,uBAAM,CAAC,WAAW,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC;AAC/C,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,SAAA;KACF;"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { ChildModel } from "@warlock.js/cascade";
|
|
2
|
+
import type { DeviceInfo, TokenPair } from "../contracts/types";
|
|
3
|
+
import type { Auth } from "../models/auth";
|
|
4
|
+
import { RefreshToken } from "../models/refresh-token";
|
|
5
|
+
declare class AuthService {
|
|
6
|
+
/**
|
|
7
|
+
* Build access token payload from user
|
|
8
|
+
*/
|
|
9
|
+
buildAccessTokenPayload(user: Auth): {
|
|
10
|
+
id: any;
|
|
11
|
+
_id: any;
|
|
12
|
+
userType: string;
|
|
13
|
+
createdAt: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Generate access token for user
|
|
17
|
+
*/
|
|
18
|
+
generateAccessToken(user: Auth, payload?: any): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Create refresh token for user
|
|
21
|
+
*/
|
|
22
|
+
createRefreshToken(user: Auth, deviceInfo?: DeviceInfo): Promise<RefreshToken>;
|
|
23
|
+
/**
|
|
24
|
+
* Create both access and refresh tokens
|
|
25
|
+
*/
|
|
26
|
+
createTokenPair(user: Auth, deviceInfo?: DeviceInfo): Promise<TokenPair>;
|
|
27
|
+
/**
|
|
28
|
+
* Refresh tokens using a refresh token
|
|
29
|
+
*/
|
|
30
|
+
refreshTokens(refreshTokenString: string, deviceInfo?: DeviceInfo): Promise<TokenPair | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Verify password
|
|
33
|
+
*/
|
|
34
|
+
verifyPassword(hashedPassword: string, plainPassword: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Attempt to login user with given credentials
|
|
37
|
+
*/
|
|
38
|
+
attemptLogin<T>(Model: ChildModel<T>, data: any): Promise<T | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Full login flow: validate credentials, create tokens, emit events
|
|
41
|
+
* Returns token pair on success, null on failure
|
|
42
|
+
*/
|
|
43
|
+
login<T extends Auth>(Model: ChildModel<T>, credentials: any, deviceInfo?: DeviceInfo): Promise<{
|
|
44
|
+
user: T;
|
|
45
|
+
tokens: TokenPair;
|
|
46
|
+
} | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Logout user (revoke specific refresh token)
|
|
49
|
+
*/
|
|
50
|
+
logout(user: Auth, refreshToken?: RefreshToken): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Remove specific access token
|
|
53
|
+
*/
|
|
54
|
+
removeAccessToken(user: Auth, token: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Revoke all tokens for a user
|
|
57
|
+
*/
|
|
58
|
+
revokeAllTokens(user: Auth): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Revoke entire token family (for rotation breach detection)
|
|
61
|
+
*/
|
|
62
|
+
revokeTokenFamily(familyId: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Cleanup expired tokens
|
|
65
|
+
*/
|
|
66
|
+
cleanupExpiredTokens(): Promise<number>;
|
|
67
|
+
/**
|
|
68
|
+
* Enforce max refresh tokens per user
|
|
69
|
+
*/
|
|
70
|
+
private enforceMaxRefreshTokens;
|
|
71
|
+
/**
|
|
72
|
+
* Get active sessions for user
|
|
73
|
+
*/
|
|
74
|
+
getActiveSessions(user: Auth): Promise<RefreshToken[]>;
|
|
75
|
+
}
|
|
76
|
+
export declare const authService: AuthService;
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=auth.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAKvD,cAAM,WAAW;IACf;;OAEG;IACI,uBAAuB,CAAC,IAAI,EAAE,IAAI;;;;;;IASzC;;OAEG;IACU,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB5E;;OAEG;IACU,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAsC3F;;OAEG;IACU,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAiBrF;;OAEG;IACU,aAAa,CACxB,kBAAkB,EAAE,MAAM,EAC1B,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAoD5B;;OAEG;IACI,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAI7E;;OAEG;IACU,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAqBhF;;;OAGG;IACU,KAAK,CAAC,CAAC,SAAS,IAAI,EAC/B,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EACpB,WAAW,EAAE,GAAG,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IAejD;;OAEG;IACU,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3E;;OAEG;IACU,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE;;OAEG;IACU,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBvD;;OAEG;IACU,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D;;OAEG;IACU,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAcpD;;OAEG;YACW,uBAAuB;IAmBrC;;OAEG;IACU,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CASpE;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
'use strict';var password=require('@mongez/password'),reinforcements=require('@mongez/reinforcements'),core=require('@warlock.js/core'),accessToken=require('../models/access-token/access-token.js');require('../models/access-token/migration.js');var refreshToken=require('../models/refresh-token/refresh-token.js'),duration=require('../utils/duration.js'),authEvents=require('./auth-events.js'),jwt=require('./jwt.js');class AuthService {
|
|
2
|
+
/**
|
|
3
|
+
* Build access token payload from user
|
|
4
|
+
*/
|
|
5
|
+
buildAccessTokenPayload(user) {
|
|
6
|
+
return {
|
|
7
|
+
id: user.id,
|
|
8
|
+
_id: user._id,
|
|
9
|
+
userType: user.userType,
|
|
10
|
+
createdAt: Date.now(),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate access token for user
|
|
15
|
+
*/
|
|
16
|
+
async generateAccessToken(user, payload) {
|
|
17
|
+
const data = payload || this.buildAccessTokenPayload(user);
|
|
18
|
+
const expiresInConfig = core.config.key("auth.jwt.expiresIn");
|
|
19
|
+
const expiresIn = duration.toJwtExpiresIn(expiresInConfig, 3600000); // default 1 hour
|
|
20
|
+
// If expiresIn is undefined, token never expires
|
|
21
|
+
const token = expiresIn ? await jwt.jwt.generate(data, { expiresIn }) : await jwt.jwt.generate(data);
|
|
22
|
+
// Store in database (fire and forget)
|
|
23
|
+
accessToken.AccessToken.create({
|
|
24
|
+
token,
|
|
25
|
+
user: data,
|
|
26
|
+
});
|
|
27
|
+
return token;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create refresh token for user
|
|
31
|
+
*/
|
|
32
|
+
async createRefreshToken(user, deviceInfo) {
|
|
33
|
+
const familyId = deviceInfo?.familyId || reinforcements.Random.string(32);
|
|
34
|
+
const expiresInConfig = core.config.key("auth.jwt.refresh.expiresIn");
|
|
35
|
+
const expiresInMs = duration.parseExpirationToMs(expiresInConfig, 7 * 24 * 60 * 60 * 1000); // default 7 days
|
|
36
|
+
const payload = {
|
|
37
|
+
userId: user.id,
|
|
38
|
+
userType: user.userType,
|
|
39
|
+
familyId,
|
|
40
|
+
};
|
|
41
|
+
const token = await jwt.jwt.generateRefreshToken(payload);
|
|
42
|
+
// Enforce max tokens per user
|
|
43
|
+
await this.enforceMaxRefreshTokens(user);
|
|
44
|
+
// Calculate expiration date (undefined means never expires, but we still set a far future date)
|
|
45
|
+
const expiresAt = expiresInMs
|
|
46
|
+
? new Date(Date.now() + expiresInMs)
|
|
47
|
+
: new Date(Date.now() + 100 * 365 * 24 * 60 * 60 * 1000);
|
|
48
|
+
// Store in database
|
|
49
|
+
return refreshToken.RefreshToken.create({
|
|
50
|
+
token,
|
|
51
|
+
userId: user.id,
|
|
52
|
+
userType: user.userType,
|
|
53
|
+
familyId,
|
|
54
|
+
expiresAt,
|
|
55
|
+
deviceInfo: deviceInfo
|
|
56
|
+
? {
|
|
57
|
+
userAgent: deviceInfo.userAgent,
|
|
58
|
+
ip: deviceInfo.ip,
|
|
59
|
+
deviceId: deviceInfo.deviceId,
|
|
60
|
+
}
|
|
61
|
+
: undefined,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create both access and refresh tokens
|
|
66
|
+
*/
|
|
67
|
+
async createTokenPair(user, deviceInfo) {
|
|
68
|
+
const accessToken = await this.generateAccessToken(user);
|
|
69
|
+
const refreshToken = await this.createRefreshToken(user, deviceInfo);
|
|
70
|
+
const tokenPair = {
|
|
71
|
+
accessToken,
|
|
72
|
+
refreshToken: refreshToken.get("token"),
|
|
73
|
+
expiresIn: core.config.key("auth.jwt.expiresIn", "1h"),
|
|
74
|
+
};
|
|
75
|
+
// Emit events
|
|
76
|
+
authEvents.authEvents.emit("token.created", user, tokenPair);
|
|
77
|
+
authEvents.authEvents.emit("session.created", user, refreshToken, deviceInfo);
|
|
78
|
+
return tokenPair;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Refresh tokens using a refresh token
|
|
82
|
+
*/
|
|
83
|
+
async refreshTokens(refreshTokenString, deviceInfo) {
|
|
84
|
+
try {
|
|
85
|
+
// 1. Verify JWT signature
|
|
86
|
+
const decoded = await jwt.jwt.verifyRefreshToken(refreshTokenString);
|
|
87
|
+
if (!decoded)
|
|
88
|
+
return null;
|
|
89
|
+
// 2. Find token in database
|
|
90
|
+
const refreshToken$1 = await refreshToken.RefreshToken.first({ token: refreshTokenString });
|
|
91
|
+
if (!refreshToken$1?.isValid) {
|
|
92
|
+
// If token was already used (rotation detection), revoke entire family
|
|
93
|
+
if (refreshToken$1) {
|
|
94
|
+
await this.revokeTokenFamily(refreshToken$1.get("familyId"));
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// 3. Get user model and find user
|
|
99
|
+
const UserModel = core.config.key(`auth.userType.${decoded.userType}`);
|
|
100
|
+
if (!UserModel)
|
|
101
|
+
return null;
|
|
102
|
+
const user = (await UserModel.find(decoded.userId));
|
|
103
|
+
if (!user)
|
|
104
|
+
return null;
|
|
105
|
+
// 4. Rotate token if enabled (revoke old token)
|
|
106
|
+
const rotationEnabled = core.config.key("auth.jwt.refresh.rotation", true);
|
|
107
|
+
if (rotationEnabled) {
|
|
108
|
+
await refreshToken$1.revoke();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
await refreshToken$1.markAsUsed();
|
|
112
|
+
}
|
|
113
|
+
// 5. Generate new token pair (keep same family)
|
|
114
|
+
const newTokenPair = await this.createTokenPair(user, {
|
|
115
|
+
...deviceInfo,
|
|
116
|
+
familyId: refreshToken$1.get("familyId"),
|
|
117
|
+
});
|
|
118
|
+
// Emit token refreshed event
|
|
119
|
+
authEvents.authEvents.emit("token.refreshed", user, newTokenPair, refreshToken$1);
|
|
120
|
+
return newTokenPair;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Verify password
|
|
128
|
+
*/
|
|
129
|
+
verifyPassword(hashedPassword, plainPassword) {
|
|
130
|
+
return password.verify(String(hashedPassword), String(plainPassword));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Attempt to login user with given credentials
|
|
134
|
+
*/
|
|
135
|
+
async attemptLogin(Model, data) {
|
|
136
|
+
const { password, ...otherData } = data;
|
|
137
|
+
// Emit login attempt event
|
|
138
|
+
authEvents.authEvents.emit("login.attempt", otherData);
|
|
139
|
+
const user = (await Model.first(otherData));
|
|
140
|
+
if (!user) {
|
|
141
|
+
authEvents.authEvents.emit("login.failed", otherData, "User not found");
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
if (!this.verifyPassword(user.get("password"), password)) {
|
|
145
|
+
authEvents.authEvents.emit("login.failed", otherData, "Invalid password");
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
return user;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Full login flow: validate credentials, create tokens, emit events
|
|
152
|
+
* Returns token pair on success, null on failure
|
|
153
|
+
*/
|
|
154
|
+
async login(Model, credentials, deviceInfo) {
|
|
155
|
+
const user = await this.attemptLogin(Model, credentials);
|
|
156
|
+
if (!user) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
const tokens = await this.createTokenPair(user, deviceInfo);
|
|
160
|
+
// Emit login success event
|
|
161
|
+
authEvents.authEvents.emit("login.success", user, tokens, deviceInfo);
|
|
162
|
+
return { user, tokens };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Logout user (revoke specific refresh token)
|
|
166
|
+
*/
|
|
167
|
+
async logout(user, refreshToken) {
|
|
168
|
+
if (refreshToken) {
|
|
169
|
+
await refreshToken.revoke();
|
|
170
|
+
authEvents.authEvents.emit("session.destroyed", user, refreshToken);
|
|
171
|
+
}
|
|
172
|
+
// Emit logout event
|
|
173
|
+
authEvents.authEvents.emit("logout", user);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Remove specific access token
|
|
177
|
+
*/
|
|
178
|
+
async removeAccessToken(user, token) {
|
|
179
|
+
accessToken.AccessToken.delete({
|
|
180
|
+
token,
|
|
181
|
+
"user.id": user.id,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Revoke all tokens for a user
|
|
186
|
+
*/
|
|
187
|
+
async revokeAllTokens(user) {
|
|
188
|
+
// Revoke all refresh tokens
|
|
189
|
+
const refreshTokens = await refreshToken.RefreshToken.aggregate()
|
|
190
|
+
.where("userId", user.id)
|
|
191
|
+
.where("userType", user.userType)
|
|
192
|
+
.where("revokedAt", null)
|
|
193
|
+
.get();
|
|
194
|
+
for (const token of refreshTokens) {
|
|
195
|
+
await token.revoke();
|
|
196
|
+
authEvents.authEvents.emit("token.revoked", user, token);
|
|
197
|
+
}
|
|
198
|
+
// Delete all access tokens
|
|
199
|
+
await accessToken.AccessToken.delete({
|
|
200
|
+
"user.id": user.id,
|
|
201
|
+
"user.userType": user.userType,
|
|
202
|
+
});
|
|
203
|
+
// Emit logout all event
|
|
204
|
+
authEvents.authEvents.emit("logout.all", user);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Revoke entire token family (for rotation breach detection)
|
|
208
|
+
*/
|
|
209
|
+
async revokeTokenFamily(familyId) {
|
|
210
|
+
const tokens = await refreshToken.RefreshToken.aggregate()
|
|
211
|
+
.where("familyId", familyId)
|
|
212
|
+
.where("revokedAt", null)
|
|
213
|
+
.get();
|
|
214
|
+
for (const token of tokens) {
|
|
215
|
+
await token.revoke();
|
|
216
|
+
}
|
|
217
|
+
// Emit family revoked event
|
|
218
|
+
authEvents.authEvents.emit("token.familyRevoked", familyId, tokens);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Cleanup expired tokens
|
|
222
|
+
*/
|
|
223
|
+
async cleanupExpiredTokens() {
|
|
224
|
+
const expiredTokens = await refreshToken.RefreshToken.aggregate().where("expiresAt", "<", new Date()).get();
|
|
225
|
+
for (const token of expiredTokens) {
|
|
226
|
+
authEvents.authEvents.emit("token.expired", token);
|
|
227
|
+
await token.destroy();
|
|
228
|
+
}
|
|
229
|
+
// Emit cleanup completed event
|
|
230
|
+
authEvents.authEvents.emit("cleanup.completed", expiredTokens.length);
|
|
231
|
+
return expiredTokens.length;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Enforce max refresh tokens per user
|
|
235
|
+
*/
|
|
236
|
+
async enforceMaxRefreshTokens(user) {
|
|
237
|
+
const maxPerUser = core.config.key("auth.jwt.refresh.maxPerUser", 5);
|
|
238
|
+
const activeTokens = await refreshToken.RefreshToken.aggregate()
|
|
239
|
+
.where("userId", user.id)
|
|
240
|
+
.where("userType", user.userType)
|
|
241
|
+
.where("revokedAt", null)
|
|
242
|
+
.sort("createdAt", "asc")
|
|
243
|
+
.get();
|
|
244
|
+
// Revoke oldest tokens if exceeding limit
|
|
245
|
+
if (activeTokens.length >= maxPerUser) {
|
|
246
|
+
const tokensToRevoke = activeTokens.slice(0, activeTokens.length - maxPerUser + 1);
|
|
247
|
+
for (const token of tokensToRevoke) {
|
|
248
|
+
await token.revoke();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get active sessions for user
|
|
254
|
+
*/
|
|
255
|
+
async getActiveSessions(user) {
|
|
256
|
+
return refreshToken.RefreshToken.aggregate()
|
|
257
|
+
.where("userId", user.id)
|
|
258
|
+
.where("userType", user.userType)
|
|
259
|
+
.where("revokedAt", null)
|
|
260
|
+
.where("expiresAt", ">", new Date())
|
|
261
|
+
.sort("createdAt", "desc")
|
|
262
|
+
.get();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const authService = new AuthService();exports.authService=authService;//# sourceMappingURL=auth.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.js","sources":["../../src/services/auth.service.ts"],"sourcesContent":[null],"names":["config","toJwtExpiresIn","jwt","AccessToken","Random","parseExpirationToMs","RefreshToken","authEvents","refreshToken","verify"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-jwt-secret.d.ts","sourceRoot":"","sources":["../../src/services/generate-jwt-secret.ts"],"names":[],"mappings":"AAKA,wBAAsB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"generate-jwt-secret.d.ts","sourceRoot":"","sources":["../../src/services/generate-jwt-secret.ts"],"names":[],"mappings":"AAKA,wBAAsB,iBAAiB,kBAmCtC"}
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
let envFile = core.rootPath(".env");
|
|
3
3
|
logger.log.info("jwt", "generating", "Generating jwt secret");
|
|
4
4
|
const environmentMode = core.environment();
|
|
5
|
-
if (!fs.
|
|
5
|
+
if (!(await fs.fileExistsAsync(envFile))) {
|
|
6
6
|
const envFileType = environmentMode === "production" ? ".env.production" : ".env.development";
|
|
7
7
|
envFile = core.rootPath(envFileType);
|
|
8
8
|
}
|
|
9
|
-
if (!fs.
|
|
9
|
+
if (!(await fs.fileExistsAsync(envFile))) {
|
|
10
10
|
logger.log.error("jwt", "error", ".env file not found");
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
13
|
-
let contents = fs.
|
|
13
|
+
let contents = await fs.getFileAsync(envFile);
|
|
14
14
|
if (contents.includes("JWT_SECRET")) {
|
|
15
15
|
logger.log.warn("jwt", "exists", "JWT secret already exists in the .env file.");
|
|
16
16
|
return;
|
|
@@ -21,6 +21,6 @@
|
|
|
21
21
|
# JWT Secret
|
|
22
22
|
JWT_SECRET=${key}
|
|
23
23
|
`;
|
|
24
|
-
fs.
|
|
24
|
+
await fs.putFileAsync(envFile, contents);
|
|
25
25
|
logger.log.success("jwt", "generated", `JWT secret key generated and added to the .env file.`);
|
|
26
26
|
}exports.generateJWTSecret=generateJWTSecret;//# sourceMappingURL=generate-jwt-secret.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-jwt-secret.js","sources":["../../src/services/generate-jwt-secret.ts"],"sourcesContent":[null],"names":["rootPath","log","environment","
|
|
1
|
+
{"version":3,"file":"generate-jwt-secret.js","sources":["../../src/services/generate-jwt-secret.ts"],"sourcesContent":[null],"names":["rootPath","log","environment","fileExistsAsync","getFileAsync","Random","putFileAsync"],"mappings":"iKAKO,eAAe,iBAAiB,GAAA;AACrC,IAAA,IAAI,OAAO,GAAGA,aAAQ,CAAC,MAAM,CAAC,CAAC;IAE/BC,UAAG,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC;AAEvD,IAAA,MAAM,eAAe,GAAGC,gBAAW,EAAE,CAAC;IAEtC,IAAI,EAAE,MAAMC,kBAAe,CAAC,OAAO,CAAC,CAAC,EAAE;AACrC,QAAA,MAAM,WAAW,GAAG,eAAe,KAAK,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAC9F,QAAA,OAAO,GAAGH,aAAQ,CAAC,WAAW,CAAC,CAAC;AACjC,KAAA;IAED,IAAI,EAAE,MAAMG,kBAAe,CAAC,OAAO,CAAC,CAAC,EAAE;QACrCF,UAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACjD,OAAO;AACR,KAAA;AAED,IAAA,IAAI,QAAQ,GAAG,MAAMG,eAAY,CAAC,OAAO,CAAC,CAAC;AAE3C,IAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;QACnCH,UAAG,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,6CAA6C,CAAC,CAAC;QACzE,OAAO;AACR,KAAA;IAED,MAAM,GAAG,GAAGI,qBAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE9B,IAAA,QAAQ,IAAI,CAAA;;;aAGD,GAAG,CAAA;CACf,CAAC;AAEA,IAAA,MAAMC,eAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEtCL,UAAG,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,CAAsD,oDAAA,CAAA,CAAC,CAAC;AAC1F"}
|
package/cjs/services/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,OAAO,CAAC"}
|
package/cjs/services/jwt.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export declare const jwt: {
|
|
|
10
10
|
* @param token The JWT token to verify.
|
|
11
11
|
* @returns The decoded token payload if verification is successful.
|
|
12
12
|
*/
|
|
13
|
-
verify(token: string, { key, algorithms, ...options }?: any): Promise<
|
|
13
|
+
verify<T = any>(token: string, { key, algorithms, ...options }?: any): Promise<T>;
|
|
14
14
|
/**
|
|
15
15
|
* Generate a new refresh token for the user.
|
|
16
16
|
*/
|
|
@@ -18,6 +18,6 @@ export declare const jwt: {
|
|
|
18
18
|
/**
|
|
19
19
|
* Verify the given refresh token.
|
|
20
20
|
*/
|
|
21
|
-
verifyRefreshToken(token: string, { key, algorithms, ...options }?: any): Promise<
|
|
21
|
+
verifyRefreshToken<T_1 = any>(token: string, { key, algorithms, ...options }?: any): Promise<T_1>;
|
|
22
22
|
};
|
|
23
23
|
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/services/jwt.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/services/jwt.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,UAAU,CAAC;AASlB,eAAO,MAAM,GAAG;IACd;;;OAGG;sBAEQ,GAAG,yCAMX,QAAQ,MAAM,CAAC;IAOlB;;;;OAIG;2BAEM,MAAM;IAYf;;OAEG;kCAEQ,GAAG,oDAOX,QAAQ,MAAM,CAAC;IAKlB;;OAEG;yCAEM,MAAM;CAUhB,CAAC"}
|