Repository navigation
Expand file tree
/
Copy pathmiddleware.ts
More file actions
103 lines (86 loc) · 2.92 KB
/
Copy pathmiddleware.ts
File metadata and controls
103 lines (86 loc) · 2.92 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import RoleEncryption from '@/shared/lib/role-encryption';
import { NextRequest, NextResponse } from 'next/server';
export async function middleware(request: NextRequest) {
try {
const accessToken = request.cookies.get('accessToken')?.value;
const refreshToken = request.cookies.get('refreshToken')?.value;
if (!refreshToken) {
return NextResponse.redirect(new URL('/login', request.url));
}
if (!accessToken) {
const response = await fetch(
`${process.env.NEXT_PUBLIC_BASE_URL}/auth/reissue`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Refresh-Token': `Bearer ${refreshToken}`,
},
}
);
if (response.status !== 200) {
const res = NextResponse.redirect(new URL('/login', request.url));
res.cookies.delete('accessToken');
res.cookies.delete('refreshToken');
res.cookies.delete('role');
res.cookies.delete('preRole');
return res;
}
const data = await response.json();
if (data && data.success && data.data) {
const {
accessToken: newAccessToken,
accessTokenExpiredAt,
refreshToken: newRefreshToken,
refreshTokenExpiredAt,
role,
} = data.data;
const accessTokenExpires = new Date(`${accessTokenExpiredAt}+09:00`);
const refreshTokenExpires = new Date(`${refreshTokenExpiredAt}+09:00`);
const nextResponse = NextResponse.next();
nextResponse.cookies.set('accessToken', newAccessToken, {
httpOnly: true,
secure: !!process.env.NODE_ENV,
expires: accessTokenExpires,
sameSite: 'strict',
path: '/',
});
nextResponse.cookies.set('refreshToken', newRefreshToken, {
httpOnly: true,
secure: !!process.env.NODE_ENV,
expires: refreshTokenExpires,
sameSite: 'strict',
path: '/',
});
nextResponse.cookies.set('role', await RoleEncryption({ role }), {
httpOnly: false,
secure: !!process.env.NODE_ENV,
expires: accessTokenExpires,
sameSite: 'strict',
path: '/',
});
nextResponse.cookies.set('preRole', role, {
httpOnly: false,
secure: !!process.env.NODE_ENV,
expires: accessTokenExpires,
sameSite: 'strict',
path: '/',
});
return nextResponse;
}
}
} catch (err) {
const response = NextResponse.redirect(new URL('/login', request.url));
response.cookies.delete('accessToken');
response.cookies.delete('refreshToken');
response.cookies.delete('role');
response.cookies.delete('preRole');
return response;
}
return NextResponse.next();
}
export const config = {
matcher: [
'/((?!api|login|register|forgot-password|_next/static|_next/image|favicon.ico|.*\\..*).*)',
],
};