Skip to content

Commit 5254150

Browse files
committed
Add function to retrieve and refresh access token
1 parent f08e9c7 commit 5254150

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

frontend/src/lib/auth.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"use server";
2+
3+
import { cookies } from "next/headers";
4+
import {
5+
AccessToken,
6+
AccessTokenPayload,
7+
AccessTokenPayloadSchema,
8+
AccessTokenResponse,
9+
AccessTokenSchema,
10+
} from "@/types/Token";
11+
import { refreshAccessToken } from "@/services/authService";
12+
13+
/**
14+
* This function retrieves the access token from the cookie store.
15+
* If the access token is expired, it will refresh the token and store the new token in the cookie store.
16+
*
17+
* @returns {Promise<AccessToken>}
18+
*/
19+
export async function getAccessToken(): Promise<AccessToken> {
20+
const cookieStore = cookies();
21+
const access_token = AccessTokenSchema.parse(
22+
cookieStore.get("access_token")?.value
23+
);
24+
25+
if (!access_token || isTokenExpired(access_token)) {
26+
const accessTokenResponse: AccessTokenResponse = await refreshAccessToken();
27+
if (accessTokenResponse.statusCode === 200 && accessTokenResponse.data) {
28+
return accessTokenResponse.data.access_token;
29+
}
30+
}
31+
32+
return access_token;
33+
}
34+
35+
function isTokenExpired(token: AccessToken): boolean {
36+
const decoded = parseJwt(token);
37+
const currentTime = Math.floor(Date.now() / 1000);
38+
return decoded.exp < currentTime;
39+
}
40+
41+
function parseJwt(token: AccessToken): AccessTokenPayload {
42+
const base64Url = token.split(".")[1];
43+
const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
44+
const jsonPayload = decodeURIComponent(
45+
atob(base64)
46+
.split("")
47+
.map((c) => {
48+
return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
49+
})
50+
.join("")
51+
);
52+
return AccessTokenPayloadSchema.parse(JSON.parse(jsonPayload));
53+
}

0 commit comments

Comments
 (0)