Skip to content

Commit 09e39ad

Browse files
committed
#24 新しい認証方法に合わせたmiddlewareの作成をする
1 parent e9f4cdd commit 09e39ad

File tree

3 files changed

+72
-56
lines changed

3 files changed

+72
-56
lines changed

api/api/static.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import datetime
22
from zoneinfo import ZoneInfo
33

4-
54
class Static:
65
"""Set the Static variables here."""
76
ACCESS_TOKEN_EXPIRE_TIME = datetime.timedelta(minutes=15)
8-
REFRESH_TOKEN_EXPIRE_TIME = datetime.timedelta(days=1)
7+
#TODO: Refresh_tokenを無期限化する
8+
REFRESH_TOKEN_EXPIRE_TIME = datetime.timedelta(days=900)
99
TIME_ZONE = ZoneInfo("Asia/Tokyo")
1010

1111
static = Static()

web/@types/axios.d.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export type AccessTokenType = string;
2+
export type RefreshTokenType = string;
3+
4+
export type CredentialsType = {
5+
access_token: AccessTokenType,
6+
refresh_token: RefreshTokenType,
7+
};
8+

web/middleware.ts

+62-54
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
import { NextRequest, NextResponse } from 'next/server';
2+
import { AccessTokenType, CredentialsType, RefreshTokenType } from './@types/axios';
3+
import { boolean } from 'yup';
24

3-
type RefreshTokenType = string;
4-
type AccessTokenType = string;
5-
const LoginPath = '/';
6-
7-
async function refershToken(sessionId: RefreshTokenType): Promise<undefined | AccessTokenType> {
5+
const refreshAccessToken = async (refreshToken: RefreshTokenType): Promise<undefined | AccessTokenType> => {
86
const token = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL}/api/token/refresh`, {
97
method: 'POST',
108
headers: {
119
Accept: 'application/json',
12-
'Content-Type': 'application/json',
10+
"Content-Type": "application/json"
1311
},
1412
body: JSON.stringify({
15-
session_id: sessionId,
13+
refresh_token: refreshToken,
1614
}),
17-
}).then((res) => (res.ok ? res : undefined));
15+
}).then(res => res.ok ? res : undefined);
1816

1917
if (token !== undefined) {
2018
const tokenData = await token.json();
@@ -23,80 +21,90 @@ async function refershToken(sessionId: RefreshTokenType): Promise<undefined | Ac
2321
return undefined;
2422
}
2523

26-
async function checkAuth(accessToken: AccessTokenType): Promise<boolean> {
24+
const confirmAccessToken = async (accessToken: AccessTokenType): Promise<boolean> => {
2725
const isSucceeded = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL}/api/users/me`, {
2826
method: 'GET',
2927
headers: {
3028
Accept: 'application/json',
3129
'Content-Type': 'application/json',
3230
Authorization: `Bearer ${accessToken}`,
3331
},
34-
}).then(async (res) => res.ok);
32+
}).then(async res => res.ok);
3533

36-
return isSucceeded;
34+
return isSucceeded
3735
}
3836

39-
function redirectToLoginPage(request: NextRequest): NextResponse {
40-
return NextResponse.redirect(new URL(LoginPath, request.url));
37+
const createNewUser = async (): Promise<CredentialsType | undefined> => {
38+
const credentials = await fetch(`${process.env.NEXT_PUBLIC_BASE_URL}/api/users`, {
39+
method: 'POST',
40+
headers: {
41+
Accept: 'application/json',
42+
"Content-Type": "application/json"
43+
}
44+
}).then(res => res.ok ? res : undefined);
45+
46+
if (credentials !== undefined) {
47+
const credentialsData = await credentials.json();
48+
return credentialsData as CredentialsType
49+
}
50+
return undefined;
4151
}
4252

43-
function redirectToHomePage(request: NextRequest): NextResponse {
44-
return NextResponse.redirect(new URL('/', request.url));
53+
const whenNotAuthenticated = async (request: NextRequest ,response: NextResponse): Promise<NextResponse> => {
54+
const credentials = await createNewUser()
55+
if (credentials !== undefined) {
56+
console.log(credentials)
57+
response.cookies.set({
58+
name: 'refresh_token',
59+
value: credentials.refresh_token,
60+
httpOnly: true,
61+
secure: process.env.NODE_ENV === 'production',
62+
sameSite: 'strict',
63+
domain: request.nextUrl.domainLocale?.domain,
64+
});
65+
}
66+
return response
4567
}
4668

47-
async function middleware(request: NextRequest) {
69+
70+
const middleware = async (request: NextRequest) => {
4871
const response = await NextResponse.next();
49-
const refreshToken: RefreshTokenType | undefined = request.cookies.get('session_id')?.value;
50-
let accessToken: AccessTokenType | undefined = request.cookies.get('access_token')?.value;
5172

52-
console.log(request.nextUrl.pathname);
53-
if (request.nextUrl.pathname === LoginPath && accessToken !== undefined) {
54-
if (await checkAuth(accessToken)) {
55-
return redirectToHomePage(request);
73+
const refreshToken: RefreshTokenType | undefined = request.cookies.get("refresh_token")?.value;
74+
let accessToken: RefreshTokenType | undefined = request.cookies.get("access_token")?.value;
75+
76+
const isAuthenticated = async () => {
77+
if (accessToken !== undefined && await confirmAccessToken(accessToken)) {
78+
return true;
5679
}
5780

5881
if (refreshToken !== undefined) {
59-
accessToken = await refershToken(refreshToken);
60-
console.log(accessToken);
61-
if (accessToken !== undefined && (await checkAuth(accessToken))) {
62-
return redirectToHomePage(request);
82+
accessToken = await refreshAccessToken(refreshToken);
83+
84+
if (accessToken !== undefined && await confirmAccessToken(accessToken)) {
85+
response.cookies.set({
86+
name: 'access_token',
87+
value: accessToken,
88+
httpOnly: true,
89+
secure: process.env.NODE_ENV === 'production',
90+
sameSite: 'strict',
91+
domain: request.nextUrl.domainLocale?.domain,
92+
});
93+
return true
6394
}
6495
}
96+
return false;
6597
}
66-
// If accessToken is not validated or null.
67-
if (accessToken === undefined || (accessToken !== undefined && !(await checkAuth(accessToken)))) {
68-
if (refreshToken !== undefined) {
69-
accessToken = await refershToken(refreshToken);
70-
71-
// Check the accessToken was refreshed
72-
if (
73-
accessToken === undefined ||
74-
(accessToken !== undefined && !(await checkAuth(accessToken)))
75-
) {
76-
return redirectToLoginPage(request);
77-
}
78-
response.cookies.set({
79-
name: 'access_token',
80-
value: accessToken,
81-
httpOnly: true,
82-
secure: process.env.NODE_ENV === 'production',
83-
sameSite: 'strict',
84-
domain: request.nextUrl.domainLocale?.domain,
85-
});
86-
}
87-
88-
if (request.nextUrl.pathname !== LoginPath) {
89-
return redirectToLoginPage(request);
90-
}
9198

92-
return response;
99+
if (!(await isAuthenticated())) {
100+
return await whenNotAuthenticated(request, response)
93101
}
94102

95-
return response;
103+
return response
96104
}
97105

98106
export const config = {
99-
matcher: [],
107+
matcher: ['/((?!api|_next/static|favicon.ico).*)',],
100108
};
101109

102110
export default middleware;

0 commit comments

Comments
 (0)