@c9up/warden 0.1.16 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/AuthManager.d.ts +40 -0
  2. package/dist/AuthManager.d.ts.map +1 -1
  3. package/dist/AuthManager.js +45 -3
  4. package/dist/AuthManager.js.map +1 -1
  5. package/dist/Authenticator.d.ts.map +1 -1
  6. package/dist/Authenticator.js +18 -2
  7. package/dist/Authenticator.js.map +1 -1
  8. package/dist/RedisBlacklistDriver.d.ts +7 -1
  9. package/dist/RedisBlacklistDriver.d.ts.map +1 -1
  10. package/dist/RedisBlacklistDriver.js +30 -5
  11. package/dist/RedisBlacklistDriver.js.map +1 -1
  12. package/dist/RememberMeToken.d.ts +99 -0
  13. package/dist/RememberMeToken.d.ts.map +1 -0
  14. package/dist/RememberMeToken.js +167 -0
  15. package/dist/RememberMeToken.js.map +1 -0
  16. package/dist/ResilientBlacklistDriver.d.ts +15 -9
  17. package/dist/ResilientBlacklistDriver.d.ts.map +1 -1
  18. package/dist/ResilientBlacklistDriver.js +53 -15
  19. package/dist/ResilientBlacklistDriver.js.map +1 -1
  20. package/dist/WardenProvider.d.ts +1 -0
  21. package/dist/WardenProvider.d.ts.map +1 -1
  22. package/dist/WardenProvider.js +64 -0
  23. package/dist/WardenProvider.js.map +1 -1
  24. package/dist/bouncer/Bouncer.d.ts +32 -1
  25. package/dist/bouncer/Bouncer.d.ts.map +1 -1
  26. package/dist/bouncer/Bouncer.js +54 -0
  27. package/dist/bouncer/Bouncer.js.map +1 -1
  28. package/dist/config.d.ts +3 -0
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +5 -0
  31. package/dist/config.js.map +1 -1
  32. package/dist/firstcontact/drivers/GitHubDriver.d.ts.map +1 -1
  33. package/dist/firstcontact/drivers/GitHubDriver.js +2 -3
  34. package/dist/firstcontact/drivers/GitHubDriver.js.map +1 -1
  35. package/dist/firstcontact/drivers/GoogleDriver.d.ts.map +1 -1
  36. package/dist/firstcontact/drivers/GoogleDriver.js +2 -3
  37. package/dist/firstcontact/drivers/GoogleDriver.js.map +1 -1
  38. package/dist/firstcontact/types.d.ts +10 -0
  39. package/dist/firstcontact/types.d.ts.map +1 -1
  40. package/dist/firstcontact/types.js +18 -1
  41. package/dist/firstcontact/types.js.map +1 -1
  42. package/dist/index.d.ts +8 -4
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +5 -2
  45. package/dist/index.js.map +1 -1
  46. package/dist/mfa/MfaManager.d.ts.map +1 -1
  47. package/dist/mfa/MfaManager.js +14 -5
  48. package/dist/mfa/MfaManager.js.map +1 -1
  49. package/dist/mfa/TotpProvider.d.ts +34 -1
  50. package/dist/mfa/TotpProvider.d.ts.map +1 -1
  51. package/dist/mfa/TotpProvider.js +60 -4
  52. package/dist/mfa/TotpProvider.js.map +1 -1
  53. package/dist/mfa/webauthn-codec.d.ts +6 -1
  54. package/dist/mfa/webauthn-codec.d.ts.map +1 -1
  55. package/dist/mfa/webauthn-codec.js +50 -6
  56. package/dist/mfa/webauthn-codec.js.map +1 -1
  57. package/dist/middleware.d.ts.map +1 -1
  58. package/dist/middleware.js +46 -1
  59. package/dist/middleware.js.map +1 -1
  60. package/dist/quasar.d.ts +18 -0
  61. package/dist/quasar.d.ts.map +1 -0
  62. package/dist/quasar.js +56 -0
  63. package/dist/quasar.js.map +1 -0
  64. package/dist/strategies/ApiKeyStrategy.d.ts +10 -1
  65. package/dist/strategies/ApiKeyStrategy.d.ts.map +1 -1
  66. package/dist/strategies/ApiKeyStrategy.js +16 -0
  67. package/dist/strategies/ApiKeyStrategy.js.map +1 -1
  68. package/dist/strategies/BasicAuthStrategy.d.ts +59 -0
  69. package/dist/strategies/BasicAuthStrategy.d.ts.map +1 -0
  70. package/dist/strategies/BasicAuthStrategy.js +97 -0
  71. package/dist/strategies/BasicAuthStrategy.js.map +1 -0
  72. package/dist/strategies/JwtStrategy.d.ts +10 -1
  73. package/dist/strategies/JwtStrategy.d.ts.map +1 -1
  74. package/dist/strategies/JwtStrategy.js +11 -0
  75. package/dist/strategies/JwtStrategy.js.map +1 -1
  76. package/dist/strategies/SessionStrategy.d.ts +58 -2
  77. package/dist/strategies/SessionStrategy.d.ts.map +1 -1
  78. package/dist/strategies/SessionStrategy.js +75 -1
  79. package/dist/strategies/SessionStrategy.js.map +1 -1
  80. package/index.darwin-arm64.node +0 -0
  81. package/index.darwin-x64.node +0 -0
  82. package/index.linux-arm64-gnu.node +0 -0
  83. package/index.linux-x64-gnu.node +0 -0
  84. package/index.win32-x64-msvc.node +0 -0
  85. package/package.json +9 -3
  86. package/src/AuthManager.ts +80 -0
  87. package/src/Authenticator.ts +22 -3
  88. package/src/RedisBlacklistDriver.ts +39 -5
  89. package/src/RememberMeToken.ts +223 -0
  90. package/src/ResilientBlacklistDriver.ts +58 -18
  91. package/src/WardenProvider.ts +90 -0
  92. package/src/bouncer/Bouncer.ts +61 -1
  93. package/src/config.ts +9 -0
  94. package/src/firstcontact/drivers/GitHubDriver.ts +2 -3
  95. package/src/firstcontact/drivers/GoogleDriver.ts +2 -3
  96. package/src/firstcontact/types.ts +24 -0
  97. package/src/index.ts +25 -2
  98. package/src/mfa/MfaManager.ts +15 -8
  99. package/src/mfa/TotpProvider.ts +90 -6
  100. package/src/mfa/webauthn-codec.ts +48 -6
  101. package/src/middleware.ts +55 -2
  102. package/src/quasar.ts +78 -0
  103. package/src/strategies/ApiKeyStrategy.ts +23 -1
  104. package/src/strategies/BasicAuthStrategy.ts +127 -0
  105. package/src/strategies/JwtStrategy.ts +18 -1
  106. package/src/strategies/SessionStrategy.ts +113 -2
@@ -25,10 +25,31 @@ export interface AuthResult {
25
25
  */
26
26
  strategyCrash?: true;
27
27
  }
28
+ /**
29
+ * What a test client must send to act as a user (AdonisJS `AuthClientResponse`).
30
+ *
31
+ * Each guard answers in its own currency — a header for a token guard, a
32
+ * session entry for a session guard — so the test harness applies whichever
33
+ * fields come back instead of knowing how each guard authenticates.
34
+ */
35
+ export interface AuthClientResponse {
36
+ /** Headers to set on the request. */
37
+ headers?: Record<string, string>;
38
+ /** Session values to seed before the request. */
39
+ session?: Record<string, unknown>;
40
+ /** Cookies to send. */
41
+ cookies?: Record<string, string>;
42
+ }
28
43
  export interface AuthStrategy {
29
44
  name: string;
30
45
  authenticate(credentials: Record<string, unknown>): Promise<AuthResult>;
31
46
  verify(token: string, context?: Record<string, unknown>): Promise<AuthResult>;
47
+ /**
48
+ * Build what a test client sends to be this user (AdonisJS
49
+ * `authenticateAsClient`). Optional: a guard with no test seam simply has
50
+ * none, and the harness says so instead of forging one.
51
+ */
52
+ authenticateAsClient?(...args: never[]): Promise<AuthClientResponse> | AuthClientResponse;
32
53
  }
33
54
  /**
34
55
  * AuthManager configuration. Two equivalent forms are accepted:
@@ -62,10 +83,29 @@ export interface AuthConfig {
62
83
  /**
63
84
  * Manages authentication strategies and provides guard/permission checks.
64
85
  */
86
+ /**
87
+ * The slice of an event emitter warden publishes through — `emit(name, data)`,
88
+ * which is what both `@c9up/ream`'s Emitter and Adonis' expose.
89
+ */
90
+ export interface WardenEmitter {
91
+ emit(event: string, data: unknown): unknown;
92
+ }
65
93
  export declare class AuthManager {
94
+ #private;
66
95
  private guards;
67
96
  private default;
68
97
  private readonly rights;
98
+ /**
99
+ * Publish auth events on `emitter`. AdonisJS emits six of them from its
100
+ * session guard, and an app that audits logins reads exactly those.
101
+ */
102
+ setEmitter(emitter: WardenEmitter): this;
103
+ /**
104
+ * Publish one auth event. Public so the per-request `Authenticator` can
105
+ * report what it observed — it holds the guard chain, the manager holds the
106
+ * emitter.
107
+ */
108
+ emitAuthEvent(event: string, payload: Record<string, unknown>): void;
69
109
  constructor(config: AuthConfig);
70
110
  /** Authenticate with credentials using a specific or default strategy. */
71
111
  authenticate(credentials: Record<string, unknown>, strategyName?: string): Promise<AuthResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":"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"}
@@ -14,15 +14,43 @@ import { RightsResolver } from "./rights/RightsResolver.js";
14
14
  function isTokenIssuer(strategy) {
15
15
  return "signToken" in strategy && typeof strategy.signToken === "function";
16
16
  }
17
- /**
18
- * Manages authentication strategies and provides guard/permission checks.
19
- */
20
17
  export class AuthManager {
21
18
  // AdonisJS names: `guards` (name → strategy) and `default` (the guard used
22
19
  // when none is named). Renamed from the previous `strategies`/`defaultStrategy`.
23
20
  guards = new Map();
24
21
  default;
25
22
  rights;
23
+ /**
24
+ * Where auth events go. Structural and optional: warden is a leaf and must
25
+ * not import an emitter — a host wires its own through `setEmitter`, and one
26
+ * that wires none simply gets no events.
27
+ */
28
+ #emitter;
29
+ /**
30
+ * Publish auth events on `emitter`. AdonisJS emits six of them from its
31
+ * session guard, and an app that audits logins reads exactly those.
32
+ */
33
+ setEmitter(emitter) {
34
+ this.#emitter = emitter;
35
+ return this;
36
+ }
37
+ /**
38
+ * Publish one auth event. Public so the per-request `Authenticator` can
39
+ * report what it observed — it holds the guard chain, the manager holds the
40
+ * emitter.
41
+ */
42
+ emitAuthEvent(event, payload) {
43
+ this.#emit(event, payload);
44
+ }
45
+ /** Fire-and-forget: an event listener must never break authentication. */
46
+ #emit(event, payload) {
47
+ try {
48
+ void this.#emitter?.emit(event, payload);
49
+ }
50
+ catch {
51
+ // A throwing listener is the listener's problem, not the login's.
52
+ }
53
+ }
26
54
  constructor(config) {
27
55
  // Normalise the two accepted forms — AdonisJS `{ default, guards }` and
28
56
  // the legacy `{ defaultStrategy, strategies }` — to the AdonisJS names.
@@ -191,7 +219,16 @@ export class AuthManager {
191
219
  hint: "login()/logout() need a stateful guard (e.g. SessionStrategy). JWT / API-key guards are stateless — mint a token with issueFor() instead.",
192
220
  });
193
221
  }
222
+ this.#emit("session_auth:login_attempted", {
223
+ guardName: strategyName ?? this.default,
224
+ user,
225
+ });
194
226
  await strategy.login(user, session);
227
+ this.#emit("session_auth:login_succeeded", {
228
+ guardName: strategyName ?? this.default,
229
+ user,
230
+ sessionId: undefined,
231
+ });
195
232
  }
196
233
  /**
197
234
  * Log a user out of a session-capable guard (AdonisJS `auth.use('web').logout()`
@@ -204,6 +241,11 @@ export class AuthManager {
204
241
  throw new WardenError("STRATEGY_CANNOT_LOGIN", `Auth strategy '${strategyName ?? this.default}' does not support session logout.`);
205
242
  }
206
243
  await strategy.logout(session);
244
+ this.#emit("session_auth:logged_out", {
245
+ guardName: strategyName ?? this.default,
246
+ user: null,
247
+ error: null,
248
+ });
207
249
  }
208
250
  }
209
251
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Authenticator.d.ts","sourceRoot":"","sources":["../src/Authenticator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Authenticator.d.ts","sourceRoot":"","sources":["../src/Authenticator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,UAAU,EAGf,KAAK,WAAW,EAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAGhD,CAAC;AAcF,iFAAiF;AACjF,MAAM,WAAW,oBAAoB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;CAClC;AAoBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,WAAW,GACf,oBAAoB,CAUtB;AAED,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACpC,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE;IACN,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;IAClC,kBAAkB,EAAE,OAAO,CAAC;CAC5B,GACC,OAAO,CAAC,WAAW,CAAC,CAyDtB;AAED;;;GAGG;AACH,qBAAa,aAAa;;gBAOxB,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa;IAQtB,kEAAkE;IAClE,IAAI,IAAI,IAAI,WAAW,GAAG,SAAS,CAIlC;IAED,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,0EAA0E;IAC1E,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,yDAAyD;IACzD,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,+DAA+D;IAC/D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAavB;AAED;;;;;GAKG;AACH,qBAAa,aAAa;;gBAQb,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW;IAKjD,0DAA0D;IAC1D,IAAI,IAAI,IAAI,WAAW,GAAG,SAAS,CAElC;IAED,qEAAqE;IACrE,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,2EAA2E;IAC3E,IAAI,uBAAuB,IAAI,OAAO,CAErC;IAED,gEAAgE;IAChE,IAAI,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAE9C;IAED;;;;OAIG;IACH,IAAI,KAAK,IAAI,MAAM,EAAE,GAAG,SAAS,CAEhC;IAED,+EAA+E;IAC/E,IAAI,WAAW,IAAI,MAAM,EAAE,GAAG,SAAS,CAEtC;IAED,qFAAqF;IACrF,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B;;;;;OAKG;IACG,iBAAiB,CACtB,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,IAAI,CAAC;IAmDhB,sEAAsE;IACtE,aAAa,IAAI,WAAW;IAU5B,2FAA2F;IAC3F,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAShC;;;;OAIG;IACH,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAOpE"}
@@ -243,6 +243,12 @@ export class Authenticator {
243
243
  async authenticateUsing(guards, options) {
244
244
  this.#attempted = true;
245
245
  const names = guards && guards.length > 0 ? guards : [this.#auth.defaultStrategyName];
246
+ const guardName = names[0] ?? this.#auth.defaultStrategyName;
247
+ // The four authentication events AdonisJS' session guard emits. An app
248
+ // auditing logins subscribes to exactly these names.
249
+ this.#auth.emitAuthEvent("session_auth:authentication_attempted", {
250
+ guardName,
251
+ });
246
252
  const creds = extractCredentials(this.#ctx, this.#auth);
247
253
  const hasSessionStrategy = names.includes("session");
248
254
  const { result, viaGuard, attemptCount, crashCount } = await tryAuthenticate(this.#auth, names, {
@@ -252,6 +258,11 @@ export class Authenticator {
252
258
  if (result?.authenticated && result.user) {
253
259
  this.#user = result.user;
254
260
  this.#viaGuard = viaGuard;
261
+ this.#auth.emitAuthEvent("session_auth:authentication_succeeded", {
262
+ guardName: viaGuard ?? guardName,
263
+ user: result.user,
264
+ sessionId: undefined,
265
+ });
255
266
  return;
256
267
  }
257
268
  // Every attempted guard crashed → a server-side incident, not a
@@ -259,10 +270,15 @@ export class Authenticator {
259
270
  if (attemptCount > 0 && crashCount === attemptCount) {
260
271
  throw new WardenError("AUTH_STRATEGY_ERROR", "Authentication unavailable — one or more strategies failed. Check server logs.", { status: 500 });
261
272
  }
262
- throw new E_UNAUTHORIZED_ACCESS(result?.error ?? "Unauthorized access", {
263
- guardDriverName: names[0] ?? this.#auth.defaultStrategyName,
273
+ const failure = new E_UNAUTHORIZED_ACCESS(result?.error ?? "Unauthorized access", {
274
+ guardDriverName: guardName,
264
275
  redirectTo: hasSessionStrategy ? options?.loginRoute : undefined,
265
276
  });
277
+ this.#auth.emitAuthEvent("session_auth:authentication_failed", {
278
+ guardName,
279
+ error: failure,
280
+ });
281
+ throw failure;
266
282
  }
267
283
  /** Return the authenticated user or throw `E_UNAUTHORIZED_ACCESS`. */
268
284
  getUserOrFail() {
@@ -1 +1 @@
1
- {"version":3,"file":"Authenticator.js","sourceRoot":"","sources":["../src/Authenticator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Authenticator.js","sourceRoot":"","sources":["../src/Authenticator.ts"],"names":[],"mappings":"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"}
@@ -17,9 +17,15 @@ export interface RedisBlacklistConfig {
17
17
  /** Key prefix for blacklist entries. Default `warden:blacklist:`. */
18
18
  prefix?: string;
19
19
  }
20
+ /**
21
+ * Where the client comes from. A resolver is what lets the blacklist name its
22
+ * connection instead of being handed a client: config is read synchronously,
23
+ * the first revocation check is not.
24
+ */
25
+ export type RedisClientSource = RedisLikeClient | (() => RedisLikeClient | Promise<RedisLikeClient>);
20
26
  export declare class RedisBlacklistDriver implements BlacklistDriver {
21
27
  #private;
22
- constructor(client: RedisLikeClient, config?: RedisBlacklistConfig);
28
+ constructor(source: RedisClientSource, config?: RedisBlacklistConfig);
23
29
  /**
24
30
  * Blacklist a JTI until its natural expiry. Tokens already past `expiresAt`
25
31
  * are skipped — there is nothing left to revoke.
@@ -1 +1 @@
1
- {"version":3,"file":"RedisBlacklistDriver.d.ts","sourceRoot":"","sources":["../src/RedisBlacklistDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC/B,GAAG,CACF,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,oBAAqB,YAAW,eAAe;;gBAI/C,MAAM,EAAE,eAAe,EAAE,MAAM,GAAE,oBAAyB;IAKtE;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIxC,yDAAyD;IACnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9B"}
1
+ {"version":3,"file":"RedisBlacklistDriver.d.ts","sourceRoot":"","sources":["../src/RedisBlacklistDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC/B,GAAG,CACF,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAC1B,eAAe,GACf,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;AAEtD,qBAAa,oBAAqB,YAAW,eAAe;;gBAM/C,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAE,oBAAyB;IA0BxE;;;OAGG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,yDAAyD;IACnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9B"}
@@ -8,12 +8,35 @@
8
8
  * `cleanup()` is a no-op.
9
9
  */
10
10
  export class RedisBlacklistDriver {
11
- #client;
11
+ #source;
12
+ #resolved;
13
+ #pending;
12
14
  #prefix;
13
- constructor(client, config = {}) {
14
- this.#client = client;
15
+ constructor(source, config = {}) {
16
+ this.#source = source;
15
17
  this.#prefix = config.prefix ?? "warden:blacklist:";
16
18
  }
19
+ /**
20
+ * The client, resolved once. Two requests racing on a cold start must not
21
+ * each open their own connection, so the in-flight promise is shared.
22
+ */
23
+ async #client() {
24
+ if (this.#resolved)
25
+ return this.#resolved;
26
+ if (typeof this.#source !== "function") {
27
+ this.#resolved = this.#source;
28
+ return this.#resolved;
29
+ }
30
+ if (!this.#pending) {
31
+ const resolver = this.#source;
32
+ this.#pending = Promise.resolve(resolver()).then((client) => {
33
+ this.#resolved = client;
34
+ this.#pending = undefined;
35
+ return client;
36
+ });
37
+ }
38
+ return this.#pending;
39
+ }
17
40
  /**
18
41
  * Blacklist a JTI until its natural expiry. Tokens already past `expiresAt`
19
42
  * are skipped — there is nothing left to revoke.
@@ -23,10 +46,12 @@ export class RedisBlacklistDriver {
23
46
  if (ttlSeconds <= 0) {
24
47
  return;
25
48
  }
26
- await this.#client.set(this.#key(jti), "1", "EX", ttlSeconds);
49
+ const client = await this.#client();
50
+ await client.set(this.#key(jti), "1", "EX", ttlSeconds);
27
51
  }
28
52
  async has(jti) {
29
- return (await this.#client.exists(this.#key(jti))) > 0;
53
+ const client = await this.#client();
54
+ return (await client.exists(this.#key(jti))) > 0;
30
55
  }
31
56
  /** No-op: Redis/KeyDB evicts expired keys on its own. */
32
57
  async cleanup() { }
@@ -1 +1 @@
1
- {"version":3,"file":"RedisBlacklistDriver.js","sourceRoot":"","sources":["../src/RedisBlacklistDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,MAAM,OAAO,oBAAoB;IACvB,OAAO,CAAkB;IACzB,OAAO,CAAS;IAEzB,YAAY,MAAuB,EAAE,SAA+B,EAAE;QACrE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,mBAAmB,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,SAAiB;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO;QACR,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACpB,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,IAAI,CAAC,GAAW;QACf,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;IAChC,CAAC;CACD"}
1
+ {"version":3,"file":"RedisBlacklistDriver.js","sourceRoot":"","sources":["../src/RedisBlacklistDriver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6BH,MAAM,OAAO,oBAAoB;IACvB,OAAO,CAAoB;IACpC,SAAS,CAA8B;IACvC,QAAQ,CAAuC;IACtC,OAAO,CAAS;IAEzB,YAAY,MAAyB,EAAE,SAA+B,EAAE;QACvE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,mBAAmB,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACZ,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACxC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9B,OAAO,IAAI,CAAC,SAAS,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC3D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;gBACxB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC1B,OAAO,MAAM,CAAC;YACf,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,SAAiB;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO;QACR,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,IAAI,CAAC,GAAW;QACf,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;IAChC,CAAC;CACD"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Remember-me tokens — "keep me signed in" that survives the session cookie.
3
+ *
4
+ * Modelled on `@adonisjs/auth`'s `RememberMeToken`
5
+ * (modules/session_guard/remember_me_token.ts), because an app moving over
6
+ * carries the same table and the same cookie:
7
+ *
8
+ * value = base64url(identifier) + "." + base64url(secret)
9
+ * stored = sha256(secret), never the secret itself
10
+ *
11
+ * The three properties that make this safe, all taken from upstream:
12
+ *
13
+ * 1. **Only a hash is stored.** A dump of the tokens table does not let anyone
14
+ * log in — the secret exists solely in the user's cookie.
15
+ * 2. **The comparison is constant-time.** Comparing hashes with `===` leaks
16
+ * how many leading bytes matched, which is enough to forge one byte at a
17
+ * time.
18
+ * 3. **A used token is recycled.** Authenticating rotates the secret and
19
+ * invalidates the old one, so a stolen cookie stops working the moment the
20
+ * legitimate user comes back.
21
+ */
22
+ /** Bytes of entropy in a token secret. Adonis defaults to 40. */
23
+ export declare const DEFAULT_SECRET_LENGTH = 40;
24
+ /** A token as persisted. The secret is NOT here — only its hash. */
25
+ export interface StoredRememberMeToken {
26
+ /** Unique id of the row; the public half of the token value. */
27
+ identifier: string;
28
+ /** Whose token this is. */
29
+ tokenableId: string | number;
30
+ /** `sha256(secret)`, hex. */
31
+ hash: string;
32
+ createdAt: number;
33
+ updatedAt: number;
34
+ expiresAt: number;
35
+ }
36
+ /** What a store must implement. Structural: warden owns no database. */
37
+ export interface RememberMeTokenDriver {
38
+ create(token: StoredRememberMeToken): Promise<void>;
39
+ find(identifier: string): Promise<StoredRememberMeToken | null>;
40
+ /** Replace the hash + expiry of an existing row (recycling). */
41
+ update(identifier: string, hash: string, expiresAt: number): Promise<void>;
42
+ delete(identifier: string): Promise<void>;
43
+ deleteAllForUser(userId: string | number): Promise<void>;
44
+ }
45
+ /** `sha256(secret)` as hex — what gets stored. */
46
+ export declare function hashSecret(secret: string): string;
47
+ /**
48
+ * Compare two hex hashes without leaking where they diverge. Length is checked
49
+ * first because `timingSafeEqual` throws on a mismatch — and the length of a
50
+ * sha256 hex digest is public anyway.
51
+ */
52
+ export declare function safeCompareHashes(a: string, b: string): boolean;
53
+ /** Split a cookie value into its identifier and secret, or `null` if malformed. */
54
+ export declare function decodeTokenValue(value: unknown): {
55
+ identifier: string;
56
+ secret: string;
57
+ } | null;
58
+ /** Build the cookie value from its two halves. */
59
+ export declare function encodeTokenValue(identifier: string, secret: string): string;
60
+ /** A freshly minted token: what to store, and what to hand the browser. */
61
+ export interface MintedRememberMeToken {
62
+ stored: StoredRememberMeToken;
63
+ /** Goes in the cookie. Never persisted. */
64
+ value: string;
65
+ }
66
+ /**
67
+ * Mint a token for `userId`, valid for `ageSeconds`.
68
+ *
69
+ * `identifier` is random too, not a counter: a guessable identifier would let
70
+ * an attacker enumerate rows and target a specific user's token.
71
+ */
72
+ export declare function mintRememberMeToken(userId: string | number, ageSeconds: number, secretLength?: number): MintedRememberMeToken;
73
+ /**
74
+ * Verify a cookie value against the store, and RECYCLE the token on success:
75
+ * the row keeps its identifier but gets a fresh secret and expiry, and the
76
+ * caller must send the returned value back as the new cookie.
77
+ *
78
+ * Recycling is what limits the damage of a stolen cookie — the thief's copy
79
+ * dies as soon as the real user authenticates again.
80
+ *
81
+ * Returns `null` for anything wrong: malformed value, unknown identifier,
82
+ * expired row, or a secret that does not match. The caller cannot tell these
83
+ * apart, which is deliberate — a distinguishable "unknown identifier" tells an
84
+ * attacker which identifiers exist.
85
+ */
86
+ export declare function verifyAndRecycleRememberMeToken(driver: RememberMeTokenDriver, cookieValue: unknown, ageSeconds: number, secretLength?: number): Promise<{
87
+ userId: string | number;
88
+ value: string;
89
+ } | null>;
90
+ /** In-memory store — for tests and single-process apps. Not for a cluster. */
91
+ export declare class MemoryRememberMeTokenDriver implements RememberMeTokenDriver {
92
+ #private;
93
+ create(token: StoredRememberMeToken): Promise<void>;
94
+ find(identifier: string): Promise<StoredRememberMeToken | null>;
95
+ update(identifier: string, hash: string, expiresAt: number): Promise<void>;
96
+ delete(identifier: string): Promise<void>;
97
+ deleteAllForUser(userId: string | number): Promise<void>;
98
+ }
99
+ //# sourceMappingURL=RememberMeToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RememberMeToken.d.ts","sourceRoot":"","sources":["../src/RememberMeToken.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,oEAAoE;AACpE,MAAM,WAAW,qBAAqB;IACrC,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,wEAAwE;AACxE,MAAM,WAAW,qBAAqB;IACrC,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IAChE,gEAAgE;IAChE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAoBD,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAK/D;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,OAAO,GACZ;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAS/C;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,2EAA2E;AAC3E,MAAM,WAAW,qBAAqB;IACrC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,YAAY,SAAwB,GAClC,qBAAqB,CAevB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,+BAA+B,CACpD,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,MAAM,EAClB,YAAY,SAAwB,GAClC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAyB5D;AAED,8EAA8E;AAC9E,qBAAa,2BAA4B,YAAW,qBAAqB;;IAGlE,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAK/D,MAAM,CACX,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAWV,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO9D"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Remember-me tokens — "keep me signed in" that survives the session cookie.
3
+ *
4
+ * Modelled on `@adonisjs/auth`'s `RememberMeToken`
5
+ * (modules/session_guard/remember_me_token.ts), because an app moving over
6
+ * carries the same table and the same cookie:
7
+ *
8
+ * value = base64url(identifier) + "." + base64url(secret)
9
+ * stored = sha256(secret), never the secret itself
10
+ *
11
+ * The three properties that make this safe, all taken from upstream:
12
+ *
13
+ * 1. **Only a hash is stored.** A dump of the tokens table does not let anyone
14
+ * log in — the secret exists solely in the user's cookie.
15
+ * 2. **The comparison is constant-time.** Comparing hashes with `===` leaks
16
+ * how many leading bytes matched, which is enough to forge one byte at a
17
+ * time.
18
+ * 3. **A used token is recycled.** Authenticating rotates the secret and
19
+ * invalidates the old one, so a stolen cookie stops working the moment the
20
+ * legitimate user comes back.
21
+ */
22
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
23
+ /** Bytes of entropy in a token secret. Adonis defaults to 40. */
24
+ export const DEFAULT_SECRET_LENGTH = 40;
25
+ /** Base64url without padding — the encoding Adonis uses for the token halves. */
26
+ function base64UrlEncode(value) {
27
+ return Buffer.from(value, "utf8").toString("base64url");
28
+ }
29
+ function base64UrlDecode(value) {
30
+ try {
31
+ const decoded = Buffer.from(value, "base64url").toString("utf8");
32
+ // A non-base64url character decodes to something that does not round-trip;
33
+ // reject rather than authenticate against a mangled identifier.
34
+ return Buffer.from(decoded, "utf8").toString("base64url") === value
35
+ ? decoded
36
+ : null;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ /** `sha256(secret)` as hex — what gets stored. */
43
+ export function hashSecret(secret) {
44
+ return createHash("sha256").update(secret).digest("hex");
45
+ }
46
+ /**
47
+ * Compare two hex hashes without leaking where they diverge. Length is checked
48
+ * first because `timingSafeEqual` throws on a mismatch — and the length of a
49
+ * sha256 hex digest is public anyway.
50
+ */
51
+ export function safeCompareHashes(a, b) {
52
+ const left = Buffer.from(a, "utf8");
53
+ const right = Buffer.from(b, "utf8");
54
+ if (left.length !== right.length)
55
+ return false;
56
+ return timingSafeEqual(left, right);
57
+ }
58
+ /** Split a cookie value into its identifier and secret, or `null` if malformed. */
59
+ export function decodeTokenValue(value) {
60
+ if (typeof value !== "string" || value.length === 0)
61
+ return null;
62
+ const [encodedIdentifier, ...rest] = value.split(".");
63
+ if (!encodedIdentifier || rest.length === 0)
64
+ return null;
65
+ const identifier = base64UrlDecode(encodedIdentifier);
66
+ const secret = base64UrlDecode(rest.join("."));
67
+ if (identifier === null || secret === null)
68
+ return null;
69
+ if (identifier === "" || secret === "")
70
+ return null;
71
+ return { identifier, secret };
72
+ }
73
+ /** Build the cookie value from its two halves. */
74
+ export function encodeTokenValue(identifier, secret) {
75
+ return `${base64UrlEncode(identifier)}.${base64UrlEncode(secret)}`;
76
+ }
77
+ /**
78
+ * Mint a token for `userId`, valid for `ageSeconds`.
79
+ *
80
+ * `identifier` is random too, not a counter: a guessable identifier would let
81
+ * an attacker enumerate rows and target a specific user's token.
82
+ */
83
+ export function mintRememberMeToken(userId, ageSeconds, secretLength = DEFAULT_SECRET_LENGTH) {
84
+ const identifier = randomBytes(16).toString("hex");
85
+ const secret = randomBytes(secretLength).toString("base64url");
86
+ const now = Date.now();
87
+ return {
88
+ stored: {
89
+ identifier,
90
+ tokenableId: userId,
91
+ hash: hashSecret(secret),
92
+ createdAt: now,
93
+ updatedAt: now,
94
+ expiresAt: now + ageSeconds * 1000,
95
+ },
96
+ value: encodeTokenValue(identifier, secret),
97
+ };
98
+ }
99
+ /**
100
+ * Verify a cookie value against the store, and RECYCLE the token on success:
101
+ * the row keeps its identifier but gets a fresh secret and expiry, and the
102
+ * caller must send the returned value back as the new cookie.
103
+ *
104
+ * Recycling is what limits the damage of a stolen cookie — the thief's copy
105
+ * dies as soon as the real user authenticates again.
106
+ *
107
+ * Returns `null` for anything wrong: malformed value, unknown identifier,
108
+ * expired row, or a secret that does not match. The caller cannot tell these
109
+ * apart, which is deliberate — a distinguishable "unknown identifier" tells an
110
+ * attacker which identifiers exist.
111
+ */
112
+ export async function verifyAndRecycleRememberMeToken(driver, cookieValue, ageSeconds, secretLength = DEFAULT_SECRET_LENGTH) {
113
+ const decoded = decodeTokenValue(cookieValue);
114
+ if (!decoded)
115
+ return null;
116
+ const stored = await driver.find(decoded.identifier);
117
+ if (!stored)
118
+ return null;
119
+ if (stored.expiresAt <= Date.now()) {
120
+ // Expired rows are removed on sight rather than left to a cleanup job.
121
+ await driver.delete(stored.identifier);
122
+ return null;
123
+ }
124
+ if (!safeCompareHashes(stored.hash, hashSecret(decoded.secret))) {
125
+ return null;
126
+ }
127
+ const secret = randomBytes(secretLength).toString("base64url");
128
+ const expiresAt = Date.now() + ageSeconds * 1000;
129
+ await driver.update(stored.identifier, hashSecret(secret), expiresAt);
130
+ return {
131
+ userId: stored.tokenableId,
132
+ value: encodeTokenValue(stored.identifier, secret),
133
+ };
134
+ }
135
+ /** In-memory store — for tests and single-process apps. Not for a cluster. */
136
+ export class MemoryRememberMeTokenDriver {
137
+ #rows = new Map();
138
+ async create(token) {
139
+ this.#rows.set(token.identifier, { ...token });
140
+ }
141
+ async find(identifier) {
142
+ const row = this.#rows.get(identifier);
143
+ return row ? { ...row } : null;
144
+ }
145
+ async update(identifier, hash, expiresAt) {
146
+ const row = this.#rows.get(identifier);
147
+ if (!row)
148
+ return;
149
+ this.#rows.set(identifier, {
150
+ ...row,
151
+ hash,
152
+ expiresAt,
153
+ updatedAt: Date.now(),
154
+ });
155
+ }
156
+ async delete(identifier) {
157
+ this.#rows.delete(identifier);
158
+ }
159
+ async deleteAllForUser(userId) {
160
+ for (const [identifier, row] of this.#rows) {
161
+ if (String(row.tokenableId) === String(userId)) {
162
+ this.#rows.delete(identifier);
163
+ }
164
+ }
165
+ }
166
+ }
167
+ //# sourceMappingURL=RememberMeToken.js.map