@weifuwujs/auth 0.9.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.
Files changed (50) hide show
  1. package/README.md +172 -0
  2. package/dist/auth.d.ts +4 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +625 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +159 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/index.d.ts +6 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +4 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/password.d.ts +21 -0
  15. package/dist/password.d.ts.map +1 -0
  16. package/dist/password.js +75 -0
  17. package/dist/password.js.map +1 -0
  18. package/dist/postgres.d.ts +22 -0
  19. package/dist/postgres.d.ts.map +1 -0
  20. package/dist/postgres.js +240 -0
  21. package/dist/postgres.js.map +1 -0
  22. package/dist/sqlite.d.ts +3 -0
  23. package/dist/sqlite.d.ts.map +1 -0
  24. package/dist/sqlite.js +2 -0
  25. package/dist/sqlite.js.map +1 -0
  26. package/dist/stores/memory.d.ts +4 -0
  27. package/dist/stores/memory.d.ts.map +1 -0
  28. package/dist/stores/memory.js +150 -0
  29. package/dist/stores/memory.js.map +1 -0
  30. package/dist/stores/sqlite.d.ts +13 -0
  31. package/dist/stores/sqlite.d.ts.map +1 -0
  32. package/dist/stores/sqlite.js +215 -0
  33. package/dist/stores/sqlite.js.map +1 -0
  34. package/dist/testing.d.ts +13 -0
  35. package/dist/testing.d.ts.map +1 -0
  36. package/dist/testing.js +123 -0
  37. package/dist/testing.js.map +1 -0
  38. package/dist/types.d.ts +190 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +53 -0
  43. package/templates/react-router-auth/app/auth.ts +13 -0
  44. package/templates/react-router-auth/app/context.ts +6 -0
  45. package/templates/react-router-auth/app/routes/account.tsx +47 -0
  46. package/templates/react-router-auth/app/routes/login.tsx +59 -0
  47. package/templates/react-router-auth/app/routes/register.tsx +47 -0
  48. package/templates/react-router-auth/app/routes/reset-password.tsx +54 -0
  49. package/templates/react-router-auth/app/routes.ts +9 -0
  50. package/templates/react-router-auth/app/server.ts +31 -0
package/dist/auth.js ADDED
@@ -0,0 +1,625 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { isValidEmail, normalizeEmail, scryptHasher, validatePassword, } from "./password.js";
3
+ const SESSION_TOUCH_INTERVAL_MS = 60_000;
4
+ function sha256(value) {
5
+ return createHash('sha256').update(value).digest('hex');
6
+ }
7
+ function newToken() {
8
+ return randomBytes(32).toString('base64url');
9
+ }
10
+ function publicUser(user) {
11
+ const { passwordHash: _passwordHash, ...rest } = user;
12
+ return rest;
13
+ }
14
+ function isCode(error, code) {
15
+ return (typeof error === 'object' &&
16
+ error !== null &&
17
+ error.code === code);
18
+ }
19
+ function parseCookies(header) {
20
+ const cookies = new Map();
21
+ if (!header)
22
+ return cookies;
23
+ for (const part of header.split(';')) {
24
+ const index = part.indexOf('=');
25
+ if (index === -1)
26
+ continue;
27
+ const name = part.slice(0, index).trim();
28
+ if (!name)
29
+ continue;
30
+ const raw = part.slice(index + 1).trim();
31
+ try {
32
+ cookies.set(name, decodeURIComponent(raw));
33
+ }
34
+ catch {
35
+ cookies.set(name, raw);
36
+ }
37
+ }
38
+ return cookies;
39
+ }
40
+ function serializeCookie(name, value, options) {
41
+ const parts = [`${name}=${encodeURIComponent(value)}`, `Path=${options.path}`];
42
+ parts.push(`Max-Age=${options.maxAge}`);
43
+ parts.push('HttpOnly');
44
+ parts.push(`SameSite=${options.sameSite}`);
45
+ if (options.secure)
46
+ parts.push('Secure');
47
+ return parts.join('; ');
48
+ }
49
+ function jsonResponse(body, status = 200) {
50
+ return new Response(JSON.stringify(body), {
51
+ status,
52
+ headers: { 'content-type': 'application/json' },
53
+ });
54
+ }
55
+ function errorResponse(status, code) {
56
+ return jsonResponse({ error: code }, status);
57
+ }
58
+ function withSetCookie(response, cookie) {
59
+ const headers = new Headers(response.headers);
60
+ headers.append('set-cookie', cookie);
61
+ return new Response(response.body, {
62
+ status: response.status,
63
+ statusText: response.statusText,
64
+ headers,
65
+ });
66
+ }
67
+ async function readJson(req) {
68
+ try {
69
+ const data = await req.json();
70
+ return data && typeof data === 'object' ? data : {};
71
+ }
72
+ catch {
73
+ return {};
74
+ }
75
+ }
76
+ /**
77
+ * 双协议读取:JSON 与 `application/x-www-form-urlencoded`(无 JS 表单)。
78
+ * `form: true` 时响应应走 303 回页(渐进增强)。
79
+ */
80
+ async function readBody(req) {
81
+ const contentType = req.headers.get('content-type') ?? '';
82
+ if (contentType.includes('application/x-www-form-urlencoded')) {
83
+ const params = new URLSearchParams(await req.text());
84
+ const data = {};
85
+ for (const [key, value] of params)
86
+ data[key] = value;
87
+ return { data, form: true };
88
+ }
89
+ return { data: await readJson(req), form: false };
90
+ }
91
+ /** 表单回跳的 `next` 只接受站内路径(防开放重定向) */
92
+ function safeNext(raw, fallback) {
93
+ if (typeof raw !== 'string')
94
+ return fallback;
95
+ if (!raw.startsWith('/') || raw.startsWith('//') || raw.startsWith('/\\')) {
96
+ return fallback;
97
+ }
98
+ return raw;
99
+ }
100
+ function withQuery(path, params) {
101
+ const search = new URLSearchParams(params).toString();
102
+ return path.includes('?') ? `${path}&${search}` : `${path}?${search}`;
103
+ }
104
+ /** 表单成功/失败一律 303 回页(PRG 模式),携带 cookie */
105
+ function formRedirect(location, cookie) {
106
+ const response = new Response(null, { status: 303, headers: { location } });
107
+ return cookie ? withSetCookie(response, cookie) : response;
108
+ }
109
+ function clientIp(req) {
110
+ const forwarded = req.headers.get('x-forwarded-for');
111
+ return forwarded?.split(',')[0]?.trim() || 'local';
112
+ }
113
+ function originAllowed(req, allowed) {
114
+ if (allowed === false)
115
+ return true;
116
+ const origin = req.headers.get('origin');
117
+ if (!origin)
118
+ return true;
119
+ try {
120
+ if (new URL(origin).host === new URL(req.url).host)
121
+ return true;
122
+ }
123
+ catch {
124
+ return false;
125
+ }
126
+ return Array.isArray(allowed) && allowed.includes(origin);
127
+ }
128
+ function authErrorStatus(error) {
129
+ switch (error) {
130
+ case 'invalid_credentials':
131
+ case 'unauthorized':
132
+ return 401;
133
+ case 'invalid_email':
134
+ case 'weak_password':
135
+ case 'invalid_token':
136
+ return 400;
137
+ case 'email_taken':
138
+ return 409;
139
+ case 'forbidden':
140
+ return 403;
141
+ case 'rate_limited':
142
+ return 429;
143
+ }
144
+ }
145
+ function rateLimited(resetAt, now) {
146
+ const retryAfter = Math.max(1, Math.ceil((resetAt - now) / 1000));
147
+ const response = errorResponse(429, 'rate_limited');
148
+ response.headers.set('retry-after', String(retryAfter));
149
+ return response;
150
+ }
151
+ function createRateLimiter(options) {
152
+ const max = options.max ?? 10;
153
+ const windowMs = options.windowMs ?? 60_000;
154
+ const buckets = new Map();
155
+ return {
156
+ async limit(req, key) {
157
+ const now = Date.now();
158
+ const bucketKey = `${key}:${clientIp(req)}`;
159
+ if (options.store) {
160
+ const { count, resetAt } = await options.store.hit(bucketKey, now, windowMs);
161
+ return count > max ? rateLimited(resetAt, now) : null;
162
+ }
163
+ let bucket = buckets.get(bucketKey);
164
+ if (!bucket || bucket.resetAt <= now) {
165
+ bucket = { count: 0, resetAt: now + windowMs };
166
+ buckets.set(bucketKey, bucket);
167
+ }
168
+ bucket.count++;
169
+ if (buckets.size > 10_000) {
170
+ for (const [key2, value] of buckets) {
171
+ if (value.resetAt <= now)
172
+ buckets.delete(key2);
173
+ }
174
+ }
175
+ return bucket.count > max ? rateLimited(bucket.resetAt, now) : null;
176
+ },
177
+ };
178
+ }
179
+ export function createAuth(options) {
180
+ const store = options.store;
181
+ const hasher = options.passwordHasher ?? scryptHasher;
182
+ const now = options.now ?? (() => new Date());
183
+ const cookie = {
184
+ name: options.session?.cookieName ?? 'ww_session',
185
+ maxAge: options.session?.maxAge ?? 30 * 24 * 3600,
186
+ idleMaxAge: options.session?.idleMaxAge ?? 0,
187
+ secure: options.session?.secure ?? process.env.NODE_ENV === 'production',
188
+ sameSite: options.session?.sameSite ?? 'Lax',
189
+ path: options.session?.path ?? '/',
190
+ };
191
+ const minPasswordLength = options.minPasswordLength ?? 8;
192
+ const resetTokenTtlMs = options.resetTokenTtlMs ?? 15 * 60 * 1000;
193
+ const loginPath = options.loginPath ?? '/login';
194
+ const registerPath = options.registerPath ?? '/register';
195
+ const accountPath = options.accountPath ?? '/account';
196
+ const resetPath = options.resetPath ?? '/reset-password';
197
+ const prefix = options.routePrefix ?? '/auth';
198
+ const limiter = options.rateLimit === false ? null : createRateLimiter(options.rateLimit ?? {});
199
+ let dummyHash = null;
200
+ const verifyPlain = async (plain, user) => {
201
+ if (user)
202
+ return hasher.verify(plain, user.passwordHash);
203
+ dummyHash ??= Promise.resolve(hasher.hash(randomBytes(16).toString('hex')));
204
+ await hasher.verify(plain, await dummyHash);
205
+ return false;
206
+ };
207
+ const sessionCookieValue = (token) => serializeCookie(cookie.name, token, {
208
+ maxAge: cookie.maxAge,
209
+ path: cookie.path,
210
+ secure: cookie.secure,
211
+ sameSite: cookie.sameSite,
212
+ });
213
+ const clearCookieValue = () => serializeCookie(cookie.name, '', {
214
+ maxAge: 0,
215
+ path: cookie.path,
216
+ secure: cookie.secure,
217
+ sameSite: cookie.sameSite,
218
+ });
219
+ const createSession = async (userId) => {
220
+ const token = newToken();
221
+ const expiresAt = new Date(now().getTime() + cookie.maxAge * 1000);
222
+ await store.createSession({ userId, tokenHash: sha256(token), expiresAt });
223
+ return { token, expiresAt };
224
+ };
225
+ const runHook = async (hook, user) => {
226
+ if (!hook)
227
+ return;
228
+ try {
229
+ await hook(publicUser(user));
230
+ }
231
+ catch (error) {
232
+ console.error(error);
233
+ }
234
+ };
235
+ // ---- 原语(HTTP 端点与自定义流程共用) ----
236
+ const register = async (input) => {
237
+ const email = normalizeEmail(String(input.email ?? ''));
238
+ if (!isValidEmail(email))
239
+ return { ok: false, error: 'invalid_email' };
240
+ const passwordError = validatePassword(String(input.password ?? ''), minPasswordLength);
241
+ if (passwordError)
242
+ return { ok: false, error: passwordError };
243
+ let user;
244
+ try {
245
+ user = await store.createUser({
246
+ email,
247
+ passwordHash: await hasher.hash(String(input.password)),
248
+ });
249
+ }
250
+ catch (error) {
251
+ if (isCode(error, 'email_taken'))
252
+ return { ok: false, error: 'email_taken' };
253
+ throw error;
254
+ }
255
+ await runHook(options.hooks?.onRegister, user);
256
+ return { ok: true, user: publicUser(user) };
257
+ };
258
+ const authenticate = async (input) => {
259
+ const user = await store.findUserByEmail(normalizeEmail(String(input.email ?? '')));
260
+ const plain = String(input.password ?? '');
261
+ const valid = await verifyPlain(plain, user && !user.disabledAt ? user : null);
262
+ if (!user || user.disabledAt || !valid) {
263
+ return { ok: false, error: 'invalid_credentials' };
264
+ }
265
+ if (hasher.needsRehash?.(user.passwordHash)) {
266
+ await store.updateUserPassword(user.id, await hasher.hash(plain));
267
+ }
268
+ await runHook(options.hooks?.onLogin, user);
269
+ return { ok: true, user: publicUser(user) };
270
+ };
271
+ const changePassword = async (input) => {
272
+ const user = await store.findUserById(input.userId);
273
+ if (!user || user.disabledAt)
274
+ return { ok: false, error: 'invalid_credentials' };
275
+ const valid = await hasher.verify(String(input.currentPassword ?? ''), user.passwordHash);
276
+ if (!valid)
277
+ return { ok: false, error: 'invalid_credentials' };
278
+ const passwordError = validatePassword(String(input.newPassword ?? ''), minPasswordLength);
279
+ if (passwordError)
280
+ return { ok: false, error: passwordError };
281
+ await store.updateUserPassword(user.id, await hasher.hash(String(input.newPassword)));
282
+ await store.deleteUserSessions(user.id, input.exceptSessionId);
283
+ await runHook(options.hooks?.onPasswordChange, user);
284
+ return { ok: true, user: publicUser(user) };
285
+ };
286
+ const requestPasswordReset = async (email, baseUrl) => {
287
+ const user = await store.findUserByEmail(normalizeEmail(String(email ?? '')));
288
+ if (!user || user.disabledAt)
289
+ return;
290
+ const token = newToken();
291
+ await store.createResetToken({
292
+ userId: user.id,
293
+ tokenHash: sha256(token),
294
+ expiresAt: new Date(now().getTime() + resetTokenTtlMs),
295
+ });
296
+ const base = baseUrl ?? options.baseUrl ?? '';
297
+ const url = `${base}${resetPath}?token=${encodeURIComponent(token)}`;
298
+ if (options.sendResetToken) {
299
+ try {
300
+ await options.sendResetToken(publicUser(user), url);
301
+ }
302
+ catch (error) {
303
+ console.error(error);
304
+ }
305
+ }
306
+ else if (process.env.NODE_ENV !== 'production') {
307
+ console.log(`[weifuwu/auth] 重置链接(未配置 sendResetToken): ${url}`);
308
+ }
309
+ };
310
+ const resetPassword = async (input) => {
311
+ const passwordError = validatePassword(String(input.password ?? ''), minPasswordLength);
312
+ if (passwordError)
313
+ return { ok: false, error: passwordError };
314
+ const userId = await store.consumeResetToken(sha256(String(input.token ?? '')), now());
315
+ if (!userId)
316
+ return { ok: false, error: 'invalid_token' };
317
+ const user = await store.findUserById(userId);
318
+ if (!user || user.disabledAt)
319
+ return { ok: false, error: 'invalid_token' };
320
+ await store.updateUserPassword(user.id, await hasher.hash(String(input.password)));
321
+ await store.deleteUserSessions(user.id);
322
+ await runHook(options.hooks?.onPasswordChange, user);
323
+ return { ok: true, user: publicUser(user) };
324
+ };
325
+ // ---- 中间件与 require ----
326
+ const middleware = async (req, ctx, next) => {
327
+ const cookies = parseCookies(req.headers.get('cookie'));
328
+ const rawToken = cookies.get(cookie.name);
329
+ let session = null;
330
+ let user = null;
331
+ if (rawToken) {
332
+ session = await store.findSessionByTokenHash(sha256(rawToken));
333
+ if (session) {
334
+ const timestamp = now();
335
+ const expired = session.expiresAt.getTime() <= timestamp.getTime();
336
+ const idle = cookie.idleMaxAge > 0 &&
337
+ session.lastSeenAt.getTime() + cookie.idleMaxAge * 1000 <= timestamp.getTime();
338
+ if (expired || idle) {
339
+ await store.deleteSession(session.id);
340
+ session = null;
341
+ }
342
+ else {
343
+ user = await store.findUserById(session.userId);
344
+ if (!user || user.disabledAt) {
345
+ await store.deleteSession(session.id);
346
+ session = null;
347
+ user = null;
348
+ }
349
+ else if (timestamp.getTime() - session.lastSeenAt.getTime() > SESSION_TOUCH_INTERVAL_MS) {
350
+ await store.touchSession(session.id, timestamp);
351
+ }
352
+ }
353
+ }
354
+ }
355
+ let pendingToken = null;
356
+ let loggedOut = false;
357
+ const authCtx = {
358
+ user: user ? publicUser(user) : null,
359
+ sessionId: session?.id,
360
+ async login(nextUser) {
361
+ const created = await createSession(nextUser.id);
362
+ pendingToken = created.token;
363
+ authCtx.user = nextUser;
364
+ },
365
+ async logout() {
366
+ if (session)
367
+ await store.deleteSession(session.id);
368
+ loggedOut = true;
369
+ authCtx.user = null;
370
+ },
371
+ async verifyPassword(plain) {
372
+ if (!user)
373
+ return false;
374
+ return hasher.verify(plain, user.passwordHash);
375
+ },
376
+ };
377
+ const response = await next(req, { ...ctx, auth: authCtx });
378
+ if (response instanceof Response) {
379
+ if (pendingToken)
380
+ return withSetCookie(response, sessionCookieValue(pendingToken));
381
+ if (loggedOut)
382
+ return withSetCookie(response, clearCookieValue());
383
+ }
384
+ return response;
385
+ };
386
+ const unauthenticated = (req) => {
387
+ if ((req.headers.get('accept') ?? '').includes('text/html')) {
388
+ const url = new URL(req.url);
389
+ const target = url.pathname + url.search;
390
+ return new Response(null, {
391
+ status: 302,
392
+ headers: { location: `${loginPath}?next=${encodeURIComponent(target)}` },
393
+ });
394
+ }
395
+ return errorResponse(401, 'unauthorized');
396
+ };
397
+ const require = (check) => async (req, ctx, next) => {
398
+ const authCtx = ctx.auth;
399
+ if (!authCtx) {
400
+ throw new Error('auth.require() 需要先 app.use(auth.middleware)(WS 请用 auth.install 或 app.wsUse)');
401
+ }
402
+ const user = authCtx.user;
403
+ if (!user)
404
+ return unauthenticated(req);
405
+ const passed = check === undefined
406
+ ? true
407
+ : typeof check === 'function'
408
+ ? check(user)
409
+ : user.role === check;
410
+ if (!passed)
411
+ return errorResponse(403, 'forbidden');
412
+ return next(req, ctx);
413
+ };
414
+ // ---- HTTP 端点 ----
415
+ const guardOrigin = (req) => originAllowed(req, options.origin) ? null : errorResponse(403, 'forbidden');
416
+ const limit = async (req, key) => limiter ? limiter.limit(req, key) : null;
417
+ const routesList = () => [
418
+ {
419
+ method: 'POST',
420
+ path: `${prefix}/register`,
421
+ handler: async (req) => {
422
+ const blocked = guardOrigin(req);
423
+ if (blocked)
424
+ return blocked;
425
+ const limited = await limit(req, 'register');
426
+ if (limited)
427
+ return limited;
428
+ const { data, form } = await readBody(req);
429
+ const result = await register({
430
+ email: String(data.email ?? ''),
431
+ password: String(data.password ?? ''),
432
+ });
433
+ if (!result.ok) {
434
+ return form
435
+ ? formRedirect(withQuery(registerPath, { error: result.error }))
436
+ : errorResponse(authErrorStatus(result.error), result.error);
437
+ }
438
+ const { token } = await createSession(result.user.id);
439
+ const cookie = sessionCookieValue(token);
440
+ if (form)
441
+ return formRedirect(safeNext(data.next, accountPath), cookie);
442
+ return withSetCookie(jsonResponse({ user: result.user }, 201), cookie);
443
+ },
444
+ },
445
+ {
446
+ method: 'POST',
447
+ path: `${prefix}/login`,
448
+ handler: async (req, ctx) => {
449
+ const blocked = guardOrigin(req);
450
+ if (blocked)
451
+ return blocked;
452
+ const limited = await limit(req, 'login');
453
+ if (limited)
454
+ return limited;
455
+ const { data, form } = await readBody(req);
456
+ const result = await authenticate({
457
+ email: String(data.email ?? ''),
458
+ password: String(data.password ?? ''),
459
+ });
460
+ if (!result.ok) {
461
+ return form
462
+ ? formRedirect(withQuery(loginPath, { error: result.error }))
463
+ : errorResponse(authErrorStatus(result.error), result.error);
464
+ }
465
+ // 轮换:有旧会话先删,避免 session fixation
466
+ if (ctx?.auth?.sessionId)
467
+ await store.deleteSession(ctx.auth.sessionId);
468
+ const { token } = await createSession(result.user.id);
469
+ const cookie = sessionCookieValue(token);
470
+ if (form)
471
+ return formRedirect(safeNext(data.next, accountPath), cookie);
472
+ return withSetCookie(jsonResponse({ user: result.user }), cookie);
473
+ },
474
+ },
475
+ {
476
+ method: 'POST',
477
+ path: `${prefix}/logout`,
478
+ handler: async (req, ctx) => {
479
+ const blocked = guardOrigin(req);
480
+ if (blocked)
481
+ return blocked;
482
+ const { data, form } = await readBody(req);
483
+ if (ctx?.auth?.sessionId)
484
+ await store.deleteSession(ctx.auth.sessionId);
485
+ const cleared = clearCookieValue();
486
+ if (form)
487
+ return formRedirect(safeNext(data.next, loginPath), cleared);
488
+ return withSetCookie(new Response(null, { status: 204 }), cleared);
489
+ },
490
+ },
491
+ {
492
+ method: 'GET',
493
+ path: `${prefix}/me`,
494
+ handler: async (_req, ctx) => ctx?.auth?.user ? jsonResponse({ user: ctx.auth.user }) : errorResponse(401, 'unauthorized'),
495
+ },
496
+ {
497
+ method: 'PATCH',
498
+ path: `${prefix}/me`,
499
+ handler: async (req, ctx) => {
500
+ const blocked = guardOrigin(req);
501
+ if (blocked)
502
+ return blocked;
503
+ const current = ctx?.auth?.user;
504
+ if (!current)
505
+ return errorResponse(401, 'unauthorized');
506
+ const body = await readJson(req);
507
+ const user = await store.findUserById(current.id);
508
+ if (!user)
509
+ return errorResponse(401, 'unauthorized');
510
+ const valid = await hasher.verify(String(body.password ?? ''), user.passwordHash);
511
+ if (!valid)
512
+ return errorResponse(401, 'invalid_credentials');
513
+ if (body.email !== undefined) {
514
+ const email = normalizeEmail(String(body.email));
515
+ if (!isValidEmail(email))
516
+ return errorResponse(400, 'invalid_email');
517
+ if (email !== user.email) {
518
+ try {
519
+ await store.updateUserEmail(user.id, email);
520
+ }
521
+ catch (error) {
522
+ if (isCode(error, 'email_taken'))
523
+ return errorResponse(409, 'email_taken');
524
+ throw error;
525
+ }
526
+ }
527
+ }
528
+ const updated = await store.findUserById(user.id);
529
+ return jsonResponse({ user: publicUser(updated) });
530
+ },
531
+ },
532
+ {
533
+ method: 'POST',
534
+ path: `${prefix}/password/change`,
535
+ handler: async (req, ctx) => {
536
+ const blocked = guardOrigin(req);
537
+ if (blocked)
538
+ return blocked;
539
+ const current = ctx?.auth?.user;
540
+ if (!current)
541
+ return errorResponse(401, 'unauthorized');
542
+ const { data, form } = await readBody(req);
543
+ const result = await changePassword({
544
+ userId: current.id,
545
+ currentPassword: String(data.currentPassword ?? ''),
546
+ newPassword: String(data.newPassword ?? ''),
547
+ exceptSessionId: ctx?.auth?.sessionId,
548
+ });
549
+ if (!result.ok) {
550
+ return form
551
+ ? formRedirect(withQuery(accountPath, { error: result.error }))
552
+ : errorResponse(authErrorStatus(result.error), result.error);
553
+ }
554
+ return form
555
+ ? formRedirect(accountPath)
556
+ : new Response(null, { status: 204 });
557
+ },
558
+ },
559
+ {
560
+ method: 'POST',
561
+ path: `${prefix}/password/forgot`,
562
+ handler: async (req) => {
563
+ const blocked = guardOrigin(req);
564
+ if (blocked)
565
+ return blocked;
566
+ const limited = await limit(req, 'forgot');
567
+ if (limited)
568
+ return limited;
569
+ const { data, form } = await readBody(req);
570
+ await requestPasswordReset(String(data.email ?? ''), new URL(req.url).origin);
571
+ return form
572
+ ? formRedirect(withQuery(loginPath, { sent: '1' }))
573
+ : jsonResponse({ ok: true });
574
+ },
575
+ },
576
+ {
577
+ method: 'POST',
578
+ path: `${prefix}/password/reset`,
579
+ handler: async (req) => {
580
+ const blocked = guardOrigin(req);
581
+ if (blocked)
582
+ return blocked;
583
+ const limited = await limit(req, 'reset');
584
+ if (limited)
585
+ return limited;
586
+ const { data, form } = await readBody(req);
587
+ const result = await resetPassword({
588
+ token: String(data.token ?? ''),
589
+ password: String(data.password ?? ''),
590
+ });
591
+ if (!result.ok) {
592
+ return form
593
+ ? formRedirect(withQuery(resetPath, { error: result.error }))
594
+ : errorResponse(authErrorStatus(result.error), result.error);
595
+ }
596
+ return form
597
+ ? formRedirect(withQuery(loginPath, { reset: '1' }))
598
+ : new Response(null, { status: 204 });
599
+ },
600
+ },
601
+ ];
602
+ const routes = () => routesList();
603
+ return {
604
+ store,
605
+ middleware,
606
+ require,
607
+ routes,
608
+ async migrate() {
609
+ await store.migrate?.();
610
+ },
611
+ install(app) {
612
+ app.use(middleware);
613
+ app.wsUse(middleware);
614
+ },
615
+ createSession,
616
+ register,
617
+ authenticate,
618
+ changePassword,
619
+ requestPasswordReset,
620
+ resetPassword,
621
+ sessionCookie: sessionCookieValue,
622
+ clearSessionCookie: clearCookieValue,
623
+ };
624
+ }
625
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map