Skip to content

Commit f08e9c7

Browse files
committed
Add refresh access token functionality
1 parent 3a7168b commit f08e9c7

File tree

1 file changed

+59
-9
lines changed

1 file changed

+59
-9
lines changed

frontend/src/services/authService.ts

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ import { cookies } from "next/headers";
55
import {
66
AccessTokenResponse,
77
AccessTokenResponseSchema,
8+
RefreshTokenSchema,
89
TokenPairResponseSchema,
910
} from "@/types/Token";
1011
import { LoginCredentials, SignupData } from "@/types/AuthCredentials";
1112
import { LogoutResponse, LogoutResposeSchema } from "@/types/AuthResponses";
13+
import { getAccessToken } from "@/lib/auth";
1214

1315
export async function login(
1416
credientials: LoginCredentials
@@ -28,17 +30,17 @@ export async function login(
2830

2931
const resObj = await res.json();
3032

31-
const authTokenResponse = TokenPairResponseSchema.parse(resObj);
33+
const tokenPairResponse = TokenPairResponseSchema.parse(resObj);
3234
const accessTokenResponse = AccessTokenResponseSchema.parse(resObj);
3335

34-
if (authTokenResponse.data) {
36+
if (tokenPairResponse.data) {
3537
const cookieStore = cookies();
36-
cookieStore.set("access_token", authTokenResponse.data.access_token, {
38+
cookieStore.set("access_token", tokenPairResponse.data.access_token, {
3739
httpOnly: true,
3840
// secure: true, // Uncomment this line when using HTTPS
3941
sameSite: "strict",
4042
});
41-
cookieStore.set("refresh_token", authTokenResponse.data.refresh_token, {
43+
cookieStore.set("refresh_token", tokenPairResponse.data.refresh_token, {
4244
maxAge: 60 * 60 * 24 * 7, // 7 days
4345
httpOnly: true,
4446
// secure: true, // Uncomment this line when using HTTPS
@@ -73,17 +75,17 @@ export async function signup(
7375

7476
const resObj = await res.json();
7577

76-
const authTokenResponse = TokenPairResponseSchema.parse(resObj);
78+
const tokenPairResponse = TokenPairResponseSchema.parse(resObj);
7779
const accessTokenResponse = AccessTokenResponseSchema.parse(resObj);
7880

79-
if (authTokenResponse.data) {
81+
if (tokenPairResponse.data) {
8082
const cookieStore = cookies();
81-
cookieStore.set("access_token", authTokenResponse.data.access_token, {
83+
cookieStore.set("access_token", tokenPairResponse.data.access_token, {
8284
httpOnly: true,
8385
// secure: true, // Uncomment this line when using HTTPS
8486
sameSite: "strict",
8587
});
86-
cookieStore.set("refresh_token", authTokenResponse.data.refresh_token, {
88+
cookieStore.set("refresh_token", tokenPairResponse.data.refresh_token, {
8789
maxAge: 60 * 60 * 24 * 7, // 7 days
8890
httpOnly: true,
8991
// secure: true, // Uncomment this line when using HTTPS
@@ -102,7 +104,7 @@ export async function signup(
102104

103105
export async function logout(): Promise<LogoutResponse> {
104106
try {
105-
const access_token = cookies().get("access_token");
107+
const access_token = getAccessToken();
106108

107109
const res: Response = await fetch(
108110
process.env.PUBLIC_API_URL + `/api/auth/logout`,
@@ -130,3 +132,51 @@ export async function logout(): Promise<LogoutResponse> {
130132
};
131133
}
132134
}
135+
136+
export async function refreshAccessToken(): Promise<AccessTokenResponse> {
137+
try {
138+
const cookieStore = cookies();
139+
const refresh_token = RefreshTokenSchema.parse(
140+
cookieStore.get("refresh_token")?.value
141+
);
142+
143+
const res: Response = await fetch(
144+
process.env.PUBLIC_API_URL + `/api/auth/refresh`,
145+
{
146+
cache: "no-cache",
147+
method: "POST",
148+
headers: {
149+
"Content-Type": "application/json",
150+
Authorization: `Bearer ${refresh_token}`,
151+
},
152+
}
153+
);
154+
155+
const resObj = await res.json();
156+
157+
const tokenPairResponse = TokenPairResponseSchema.parse(resObj);
158+
const accessTokenResponse = AccessTokenResponseSchema.parse(resObj);
159+
160+
if (tokenPairResponse.data) {
161+
const cookieStore = cookies();
162+
cookieStore.set("access_token", tokenPairResponse.data.access_token, {
163+
httpOnly: true,
164+
// secure: true, // Uncomment this line when using HTTPS
165+
sameSite: "strict",
166+
});
167+
cookieStore.set("refresh_token", tokenPairResponse.data.refresh_token, {
168+
maxAge: 60 * 60 * 24 * 7, // 7 days
169+
httpOnly: true,
170+
// secure: true, // Uncomment this line when using HTTPS
171+
sameSite: "strict",
172+
});
173+
}
174+
175+
return accessTokenResponse;
176+
} catch (error) {
177+
return {
178+
statusCode: 500,
179+
message: String(error),
180+
};
181+
}
182+
}

0 commit comments

Comments
 (0)