1
1
import { NextRequest , NextResponse } from 'next/server' ;
2
+ import { AccessTokenType , CredentialsType , RefreshTokenType } from './@types/axios' ;
3
+ import { boolean } from 'yup' ;
2
4
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 > => {
8
6
const token = await fetch ( `${ process . env . NEXT_PUBLIC_BASE_URL } /api/token/refresh` , {
9
7
method : 'POST' ,
10
8
headers : {
11
9
Accept : 'application/json' ,
12
- ' Content-Type' : ' application/json' ,
10
+ " Content-Type" : " application/json"
13
11
} ,
14
12
body : JSON . stringify ( {
15
- session_id : sessionId ,
13
+ refresh_token : refreshToken ,
16
14
} ) ,
17
- } ) . then ( ( res ) => ( res . ok ? res : undefined ) ) ;
15
+ } ) . then ( res => res . ok ? res : undefined ) ;
18
16
19
17
if ( token !== undefined ) {
20
18
const tokenData = await token . json ( ) ;
@@ -23,80 +21,90 @@ async function refershToken(sessionId: RefreshTokenType): Promise<undefined | Ac
23
21
return undefined ;
24
22
}
25
23
26
- async function checkAuth ( accessToken : AccessTokenType ) : Promise < boolean > {
24
+ const confirmAccessToken = async ( accessToken : AccessTokenType ) : Promise < boolean > = > {
27
25
const isSucceeded = await fetch ( `${ process . env . NEXT_PUBLIC_BASE_URL } /api/users/me` , {
28
26
method : 'GET' ,
29
27
headers : {
30
28
Accept : 'application/json' ,
31
29
'Content-Type' : 'application/json' ,
32
30
Authorization : `Bearer ${ accessToken } ` ,
33
31
} ,
34
- } ) . then ( async ( res ) => res . ok ) ;
32
+ } ) . then ( async res => res . ok ) ;
35
33
36
- return isSucceeded ;
34
+ return isSucceeded
37
35
}
38
36
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 ;
41
51
}
42
52
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
45
67
}
46
68
47
- async function middleware ( request : NextRequest ) {
69
+
70
+ const middleware = async ( request : NextRequest ) => {
48
71
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 ;
51
72
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 ;
56
79
}
57
80
58
81
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
63
94
}
64
95
}
96
+ return false ;
65
97
}
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
- }
91
98
92
- return response ;
99
+ if ( ! ( await isAuthenticated ( ) ) ) {
100
+ return await whenNotAuthenticated ( request , response )
93
101
}
94
102
95
- return response ;
103
+ return response
96
104
}
97
105
98
106
export const config = {
99
- matcher : [ ] ,
107
+ matcher : [ '/((?!api|_next/static|favicon.ico).*)' , ] ,
100
108
} ;
101
109
102
110
export default middleware ;
0 commit comments