Rewrote createSession to use jose.SignJWT with HS256. Secret now read from process.env.SESSION_SECRET via getSecret().
src/auth/session.ts:7–12createSession — replaced HMAC with jose SignJWT
src/auth/secret.ts:1–8new file — symmetric key from env
session.ts
src/auth/session.ts
secret.ts
src/auth/secret.ts
package.json
1import { SignJWT, jwtVerify } from 'jose';2import { nanoid } from 'nanoid';3import { getSecret } from './secret';4 5const SESSION_TTL = 60 * 60 * 24 * 7;6 7export async function createSession(userId: string) {8 const sessionId = nanoid();9 const token = await new SignJWT({ sub: userId, sid: sessionId })10 .setProtectedHeader({ alg: 'HS256' })11 .setExpirationTime(SESSION_TTL + 's')12 .sign(getSecret());13 return { sessionId, token };14}15 16export async function verifySession(token: string) {17 try {18 const { payload } = await jwtVerify(token, getSecret());19 return payload;20 } catch {21 return null;verifySession should throw AuthError, not return null22 }23}Rewrote createSession to use jose.SignJWT with HS256. Secret now read from process.env.SESSION_SECRET via getSecret().
| … | @@ -8,5 +8,6 @@ | ||
| 8 | 8 | "dependencies": { | |
| 9 | + | "jose": "^5.2.1", | |
| 9 | 10 | "nanoid": "^5.0.7" | |
| 10 | 11 | } |
14:16:22▶ bun run test14:16:23 PASS tests/auth.test.ts✓ createSession returns a signed JWT (48ms)✓ verifySession accepts a valid token (12ms)✗ verifySession throws on tampered token (8ms)Expected: AuthErrorReceived: null14:16:23Tests: 1 failed, 2 passed — 68ms
run_01hwf4m8kj2nqp7r