refactor: move auth api call to api file
This commit is contained in:
+2
-118
@@ -41,7 +41,7 @@ function getStorage(): Storage {
|
||||
: sessionStorage
|
||||
}
|
||||
|
||||
function getToken(key: string): string | null {
|
||||
export function getToken(key: string): string | null {
|
||||
return localStorage.getItem(key) ?? sessionStorage.getItem(key)
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ export function setTokens(accessToken: string, refreshToken: string, remember?:
|
||||
storage.setItem("refresh_token", refreshToken)
|
||||
}
|
||||
|
||||
function clearTokens() {
|
||||
export function clearTokens() {
|
||||
localStorage.removeItem("access_token")
|
||||
localStorage.removeItem("refresh_token")
|
||||
localStorage.removeItem("remember_me")
|
||||
@@ -73,36 +73,6 @@ function clearTokens() {
|
||||
sessionStorage.removeItem("refresh_token")
|
||||
}
|
||||
|
||||
export async function refreshAccessToken(): Promise<string | null> {
|
||||
if (typeof window === "undefined") return null
|
||||
|
||||
const refreshToken = getToken("refresh_token")
|
||||
if (!refreshToken) {
|
||||
clearTokens()
|
||||
return null
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await fetch("http://localhost:8080/api/auth/refresh", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ refresh_token: refreshToken }),
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
clearTokens()
|
||||
return null
|
||||
}
|
||||
|
||||
const data = await res.json()
|
||||
setTokens(data.access_token, data.refresh_token)
|
||||
return data.access_token
|
||||
} catch {
|
||||
clearTokens()
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
export function getUser(): User | null {
|
||||
if (typeof window === "undefined") return null
|
||||
|
||||
@@ -118,89 +88,3 @@ export function getUser(): User | null {
|
||||
name: payload.name,
|
||||
}
|
||||
}
|
||||
|
||||
export async function getUserAsync(): Promise<User | null> {
|
||||
if (typeof window === "undefined") return null
|
||||
|
||||
let token = getToken("access_token")
|
||||
|
||||
if (!token || isTokenExpired(token)) {
|
||||
token = await refreshAccessToken()
|
||||
if (!token) return null
|
||||
}
|
||||
|
||||
const payload = decodeJWT(token)
|
||||
if (!payload) return null
|
||||
|
||||
return {
|
||||
id: payload.sub,
|
||||
email: payload.email,
|
||||
name: payload.name,
|
||||
}
|
||||
}
|
||||
|
||||
export function getAccessToken(): string | null {
|
||||
if (typeof window === "undefined") return null
|
||||
|
||||
const token = getToken("access_token")
|
||||
if (!token || isTokenExpired(token)) return null
|
||||
return token
|
||||
}
|
||||
|
||||
export async function getAccessTokenAsync(): Promise<string | null> {
|
||||
if (typeof window === "undefined") return null
|
||||
|
||||
let token = getToken("access_token")
|
||||
if (token && !isTokenExpired(token)) return token
|
||||
|
||||
token = await refreshAccessToken()
|
||||
return token
|
||||
}
|
||||
|
||||
export async function logout() {
|
||||
if (typeof window === "undefined") return
|
||||
|
||||
const token = getToken("access_token")
|
||||
const refreshToken = getToken("refresh_token")
|
||||
|
||||
try {
|
||||
await fetch("http://localhost:8080/api/auth/logout", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: token ? `Bearer ${token}` : "",
|
||||
},
|
||||
body: JSON.stringify({ refresh_token: refreshToken }),
|
||||
})
|
||||
} catch {
|
||||
}
|
||||
|
||||
clearTokens()
|
||||
}
|
||||
|
||||
export async function fetchWithAuth(url: string, options: RequestInit = {}) {
|
||||
let token = await getAccessTokenAsync()
|
||||
|
||||
const res = await fetch(url, {
|
||||
...options,
|
||||
headers: {
|
||||
...options.headers,
|
||||
Authorization: token ? `Bearer ${token}` : "",
|
||||
},
|
||||
})
|
||||
|
||||
if (res.status === 401) {
|
||||
token = await refreshAccessToken()
|
||||
if (token) {
|
||||
return fetch(url, {
|
||||
...options,
|
||||
headers: {
|
||||
...options.headers,
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user