@fonderie/auth 1.3.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -2,8 +2,8 @@ export { IMfaChallenge, ISession, IUser } from './types.cjs';
2
2
  import { IFonderieModule, IFonderieApp } from '@fonderie/core';
3
3
  import { IStoreAdapter } from '@fonderie/store';
4
4
  import { EventBus } from '@fonderie/events';
5
- import { I as IAuthConfig } from './session-DbtCnbiG.cjs';
6
- export { A as AUTH_CONFIG_KEYS, a as AuthLimitedRoute, b as AuthMessageKey, c as IAuthRateLimitConfig, d as IAuthRuntimeConfig, e as IAuthSecrets, M as MESSAGE_KEYS, f as buildAuthAccountLimiter, g as buildAuthIpLimiter, w as withSession } from './session-DbtCnbiG.cjs';
5
+ import { I as IAuthConfig } from './session-BoJjRB7t.cjs';
6
+ export { A as AUTH_CONFIG_KEYS, a as AuthLimitedRoute, b as AuthMessageKey, c as IAuthRateLimitConfig, d as IAuthRuntimeConfig, e as IAuthSecrets, M as MESSAGE_KEYS, f as buildAuthAccountLimiter, g as buildAuthIpLimiter, w as withSession } from './session-BoJjRB7t.cjs';
7
7
  export { IUserDTO, toUserDTO } from './dtos/user.cjs';
8
8
  export { requireAuth, validate } from '@fonderie/core/middlewares';
9
9
  import { z } from 'zod';
package/dist/index.d.ts CHANGED
@@ -2,8 +2,8 @@ export { IMfaChallenge, ISession, IUser } from './types.js';
2
2
  import { IFonderieModule, IFonderieApp } from '@fonderie/core';
3
3
  import { IStoreAdapter } from '@fonderie/store';
4
4
  import { EventBus } from '@fonderie/events';
5
- import { I as IAuthConfig } from './session-DbtCnbiG.js';
6
- export { A as AUTH_CONFIG_KEYS, a as AuthLimitedRoute, b as AuthMessageKey, c as IAuthRateLimitConfig, d as IAuthRuntimeConfig, e as IAuthSecrets, M as MESSAGE_KEYS, f as buildAuthAccountLimiter, g as buildAuthIpLimiter, w as withSession } from './session-DbtCnbiG.js';
5
+ import { I as IAuthConfig } from './session-BoJjRB7t.js';
6
+ export { A as AUTH_CONFIG_KEYS, a as AuthLimitedRoute, b as AuthMessageKey, c as IAuthRateLimitConfig, d as IAuthRuntimeConfig, e as IAuthSecrets, M as MESSAGE_KEYS, f as buildAuthAccountLimiter, g as buildAuthIpLimiter, w as withSession } from './session-BoJjRB7t.js';
7
7
  export { IUserDTO, toUserDTO } from './dtos/user.js';
8
8
  export { requireAuth, validate } from '@fonderie/core/middlewares';
9
9
  import { z } from 'zod';
package/dist/index.js CHANGED
@@ -177,14 +177,19 @@ function tokenPairCookies(accessToken, refreshToken, config) {
177
177
  return [
178
178
  `access_token=${accessToken}; HttpOnly; SameSite=Strict; Path=/${secure}`,
179
179
  `refresh_token=${refreshToken}; HttpOnly; SameSite=Strict; Path=/auth/refresh${secure}`
180
- ].join(", ");
180
+ ];
181
181
  }
182
182
  function clearedTokenCookies(config) {
183
183
  const secure = secureAttr(config);
184
184
  return [
185
185
  `access_token=; HttpOnly; SameSite=Strict; Path=/; Max-Age=0${secure}`,
186
186
  `refresh_token=; HttpOnly; SameSite=Strict; Path=/auth/refresh; Max-Age=0${secure}`
187
- ].join(", ");
187
+ ];
188
+ }
189
+ function cookieHeaders(cookies) {
190
+ const headers = new Headers();
191
+ for (const c of cookies) headers.append("Set-Cookie", c);
192
+ return headers;
188
193
  }
189
194
 
190
195
  // src/controllers/mfa.controller.ts
@@ -781,9 +786,7 @@ function mfaController(store, config, issuer, bus) {
781
786
  },
782
787
  {
783
788
  status: 200,
784
- headers: {
785
- "Set-Cookie": tokenPairCookies(accessToken, refreshToken, config)
786
- }
789
+ headers: cookieHeaders(tokenPairCookies(accessToken, refreshToken, config))
787
790
  }
788
791
  );
789
792
  },
@@ -1115,9 +1118,7 @@ function authController(store, config, bus) {
1115
1118
  },
1116
1119
  {
1117
1120
  status: 201,
1118
- headers: {
1119
- "Set-Cookie": tokenPairCookies(accessToken, refreshToken, config)
1120
- }
1121
+ headers: cookieHeaders(tokenPairCookies(accessToken, refreshToken, config))
1121
1122
  }
1122
1123
  );
1123
1124
  }
@@ -1177,9 +1178,7 @@ function authController(store, config, bus) {
1177
1178
  },
1178
1179
  {
1179
1180
  status: 202,
1180
- headers: {
1181
- "Set-Cookie": tokenPairCookies(accessToken, refreshToken, config)
1182
- }
1181
+ headers: cookieHeaders(tokenPairCookies(accessToken, refreshToken, config))
1183
1182
  }
1184
1183
  );
1185
1184
  }
@@ -1236,9 +1235,7 @@ function authController(store, config, bus) {
1236
1235
  },
1237
1236
  {
1238
1237
  status: 200,
1239
- headers: {
1240
- "Set-Cookie": tokenPairCookies(accessToken, refreshToken, config)
1241
- }
1238
+ headers: cookieHeaders(tokenPairCookies(accessToken, refreshToken, config))
1242
1239
  }
1243
1240
  );
1244
1241
  }
@@ -1279,9 +1276,7 @@ function authController(store, config, bus) {
1279
1276
  },
1280
1277
  {
1281
1278
  status: 202,
1282
- headers: {
1283
- "Set-Cookie": tokenPairCookies(accessToken, refreshToken, config)
1284
- }
1279
+ headers: cookieHeaders(tokenPairCookies(accessToken, refreshToken, config))
1285
1280
  }
1286
1281
  );
1287
1282
  }
@@ -1300,9 +1295,7 @@ function authController(store, config, bus) {
1300
1295
  { reason: "USER_LOGOUT", explanation: "Logged out successfully." },
1301
1296
  {
1302
1297
  status: 200,
1303
- headers: {
1304
- "Set-Cookie": clearedTokenCookies(config)
1305
- }
1298
+ headers: cookieHeaders(clearedTokenCookies(config))
1306
1299
  }
1307
1300
  );
1308
1301
  },
@@ -1341,9 +1334,7 @@ function authController(store, config, bus) {
1341
1334
  },
1342
1335
  {
1343
1336
  status: 200,
1344
- headers: {
1345
- "Set-Cookie": tokenPairCookies(accessToken, refreshToken, config)
1346
- }
1337
+ headers: cookieHeaders(tokenPairCookies(accessToken, refreshToken, config))
1347
1338
  }
1348
1339
  );
1349
1340
  },
@@ -1490,9 +1481,7 @@ function authController(store, config, bus) {
1490
1481
  },
1491
1482
  {
1492
1483
  status: 200,
1493
- headers: {
1494
- "Set-Cookie": tokenPairCookies(accessToken, refreshToken, config)
1495
- }
1484
+ headers: cookieHeaders(tokenPairCookies(accessToken, refreshToken, config))
1496
1485
  }
1497
1486
  );
1498
1487
  }
@@ -1796,9 +1785,7 @@ function userController(store, config, bus) {
1796
1785
  { reason: "ACCOUNT_DELETED", explanation: "Account successfully deleted." },
1797
1786
  {
1798
1787
  status: 200,
1799
- headers: {
1800
- "Set-Cookie": clearedTokenCookies(config)
1801
- }
1788
+ headers: cookieHeaders(clearedTokenCookies(config))
1802
1789
  }
1803
1790
  );
1804
1791
  }
@@ -1900,9 +1887,7 @@ function oauthController(store, config) {
1900
1887
  },
1901
1888
  {
1902
1889
  status: 200,
1903
- headers: {
1904
- "Set-Cookie": tokenPairCookies(accessToken, refreshToken, config)
1905
- }
1890
+ headers: cookieHeaders(tokenPairCookies(accessToken, refreshToken, config))
1906
1891
  }
1907
1892
  );
1908
1893
  }
@@ -1919,44 +1904,42 @@ function buildAuthRoutes(store, config, bus) {
1919
1904
  const passthrough = (_ctx, next) => next();
1920
1905
  const ipLimit = (route) => buildAuthIpLimiter(route, store, config.rateLimit) ?? passthrough;
1921
1906
  const acctLimit = (route) => buildAuthAccountLimiter(route, store, config.rateLimit) ?? passthrough;
1907
+ const R = (id, method, path, ...handlers) => {
1908
+ const o = config.routes?.[id];
1909
+ if (!o) return [method, path, ...handlers];
1910
+ if (typeof o === "string") return [method, o, ...handlers];
1911
+ return [o.method ?? method, o.path ?? path, ...handlers];
1912
+ };
1922
1913
  const routes = [
1923
1914
  // Registration & Login (Public)
1924
- ["POST", "/auth/register", ipLimit("register"), validate(registerSchema), auth.register],
1925
- ["POST", "/auth/login", ipLimit("login"), validate(loginSchema), acctLimit("login"), auth.login],
1915
+ R("register", "POST", "/auth/register", ipLimit("register"), validate(registerSchema), auth.register),
1916
+ R("login", "POST", "/auth/login", ipLimit("login"), validate(loginSchema), acctLimit("login"), auth.login),
1926
1917
  // Token Management (Public)
1927
- ["POST", "/auth/refresh", validate(refreshSchema), auth.refresh],
1918
+ R("refresh", "POST", "/auth/refresh", validate(refreshSchema), auth.refresh),
1928
1919
  // Email — Password Recovery (Public)
1929
- ["POST", "/auth/email/forgot", ipLimit("forgot"), validate(forgotPasswordSchema), acctLimit("forgot"), auth.forgotPassword],
1930
- ["POST", "/auth/email/reset", validate(resetPasswordSchema), auth.resetPassword],
1920
+ R("forgotPassword", "POST", "/auth/email/forgot", ipLimit("forgot"), validate(forgotPasswordSchema), acctLimit("forgot"), auth.forgotPassword),
1921
+ R("resetPassword", "POST", "/auth/email/reset", validate(resetPasswordSchema), auth.resetPassword),
1931
1922
  // Verification (Protected — email or phone, determined by loginMethod)
1932
- ["POST", "/auth/verify", requireAuth, validate(verifySchema), auth.verify],
1933
- ["GET", "/auth/send-verification", requireAuth, auth.sendVerification],
1923
+ R("verifyEmail", "POST", "/auth/verify", requireAuth, validate(verifySchema), auth.verify),
1924
+ R("sendVerification", "GET", "/auth/send-verification", requireAuth, auth.sendVerification),
1934
1925
  // Account Management (Protected)
1935
- ["POST", "/auth/logout", requireAuth, validate(refreshSchema), auth.logout],
1926
+ R("logout", "POST", "/auth/logout", requireAuth, validate(refreshSchema), auth.logout),
1936
1927
  // User Profile (Protected; writes also gate on requireVerification)
1937
- ["GET", "/users", requireAuth, user.me],
1938
- ["PUT", "/users/profile", requireAuth, verifyGate, validate(updateProfileSchema), user.updateProfile],
1939
- ["PUT", "/users/preferences", requireAuth, verifyGate, validate(updatePreferencesSchema), user.updatePreferences],
1940
- ["PUT", "/users/email", requireAuth, verifyGate, validate(updateEmailSchema), user.updateEmail],
1941
- ["PUT", "/users/phone", requireAuth, verifyGate, validate(updatePhoneSchema), user.updatePhone],
1942
- ["PUT", "/users/password", requireAuth, validate(changePasswordSchema), user.changePassword],
1943
- ["DELETE", "/users", requireAuth, verifyGate, user.deleteMe],
1928
+ R("me", "GET", "/users", requireAuth, user.me),
1929
+ R("updateProfile", "PUT", "/users/profile", requireAuth, verifyGate, validate(updateProfileSchema), user.updateProfile),
1930
+ R("updatePreferences", "PUT", "/users/preferences", requireAuth, verifyGate, validate(updatePreferencesSchema), user.updatePreferences),
1931
+ R("updateEmail", "PUT", "/users/email", requireAuth, verifyGate, validate(updateEmailSchema), user.updateEmail),
1932
+ R("updatePhone", "PUT", "/users/phone", requireAuth, verifyGate, validate(updatePhoneSchema), user.updatePhone),
1933
+ R("changePassword", "PUT", "/users/password", requireAuth, validate(changePasswordSchema), user.changePassword),
1934
+ R("deleteMe", "DELETE", "/users", requireAuth, verifyGate, user.deleteMe),
1944
1935
  // MFA (email sessions only — requireVerified is always enforced here
1945
1936
  // because MFA is a security feature and email verification is meaningful)
1946
- ["POST", "/auth/mfa/setup", requireAuth, requireEmailLogin, requireVerified, mfa.setup],
1937
+ R("mfaSetup", "POST", "/auth/mfa/setup", requireAuth, requireEmailLogin, requireVerified, mfa.setup),
1947
1938
  // /auth/mfa/verify accepts both mfaPending tokens (TOTP/backup-code login)
1948
1939
  // and full tokens (setup confirmation), so requireAnyAuth is used here.
1949
- ["POST", "/auth/mfa/verify", ipLimit("mfaVerify"), requireAnyAuth, requireEmailLogin, requireVerified, validate(mfaTokenSchema), mfa.verify],
1950
- ["POST", "/auth/mfa/disable", requireAuth, requireEmailLogin, requireVerified, validate(mfaTokenSchema), mfa.disable],
1951
- [
1952
- "POST",
1953
- "/auth/mfa/backup-codes",
1954
- requireAuth,
1955
- requireEmailLogin,
1956
- requireVerified,
1957
- validate(mfaTokenSchema),
1958
- mfa.regenerateBackupCodes
1959
- ]
1940
+ R("mfaVerify", "POST", "/auth/mfa/verify", ipLimit("mfaVerify"), requireAnyAuth, requireEmailLogin, requireVerified, validate(mfaTokenSchema), mfa.verify),
1941
+ R("mfaDisable", "POST", "/auth/mfa/disable", requireAuth, requireEmailLogin, requireVerified, validate(mfaTokenSchema), mfa.disable),
1942
+ R("mfaBackupCodes", "POST", "/auth/mfa/backup-codes", requireAuth, requireEmailLogin, requireVerified, validate(mfaTokenSchema), mfa.regenerateBackupCodes)
1960
1943
  ];
1961
1944
  if (config.providers.includes("google")) {
1962
1945
  routes.push(