-
Notifications
You must be signed in to change notification settings - Fork 86
/
Copy path02-stateless-session.ts
80 lines (65 loc) · 1.99 KB
/
02-stateless-session.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import 'server-only';
import type { SessionPayload } from '@/app/auth/definitions';
import { SignJWT, jwtVerify } from 'jose';
import { cookies, type UnsafeUnwrappedCookies } from 'next/headers';
import { redirect } from 'next/navigation';
const secretKey = process.env.SECRET;
const key = new TextEncoder().encode(secretKey);
export async function encrypt(payload: SessionPayload) {
return new SignJWT(payload)
.setProtectedHeader({ alg: 'HS256' })
.setIssuedAt()
.setExpirationTime('1hr')
.sign(key);
}
export async function decrypt(session: string | undefined = '') {
try {
const { payload } = await jwtVerify(session, key, {
algorithms: ['HS256'],
});
return payload;
} catch (error) {
return null;
}
}
export async function createSession(userId: string) {
const expiresAt = new Date(Date.now() + 60 * 60 * 1000);
const session = await encrypt({ userId, expiresAt });
const cookieStore = await cookies()
cookieStore.set('session', session, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
expires: expiresAt,
sameSite: 'lax',
path: '/',
});
redirect('/dashboard');
}
export async function verifySession() {
const cookie = (await cookies()).get('session')?.value;
const session = await decrypt(cookie);
if (!session?.userId) {
redirect('/login');
}
return { isAuth: true, userId: Number(session.userId) };
}
export async function updateSession() {
const session = (await cookies()).get('session')?.value;
const payload = await decrypt(session);
if (!session || !payload) {
return null;
}
const expires = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);
const cookieStore = await cookies()
cookieStore.set('session', session, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
expires: expires,
sameSite: 'lax',
path: '/',
});
}
export function deleteSession() {
(cookies() as unknown as UnsafeUnwrappedCookies).delete('session');
redirect('/login');
}