diff --git a/adapter-in/admin/frontend/src/http/HttpClient.js b/adapter-in/admin/frontend/src/http/HttpClient.js index 4ba2546b..1885f7ce 100644 --- a/adapter-in/admin/frontend/src/http/HttpClient.js +++ b/adapter-in/admin/frontend/src/http/HttpClient.js @@ -1,5 +1,5 @@ import axios from "axios"; -import {getAccessToken} from "../view/auth/AuthUtils"; +import {getAccessToken, getRefreshToken, setAuthToken} from "../view/auth/AuthUtils"; export const httpClient = axios.create({ baseURL: process.env.REACT_APP_SERVER_URL, @@ -7,3 +7,34 @@ export const httpClient = axios.create({ Authorization: `Bearer ${getAccessToken()}` } }); + +httpClient.interceptors.response.use( + response => { + return response; + }, + async error => { + if (error.response.status === 401) { + try { + const refreshToken = getRefreshToken() + if (refreshToken == null) return Promise.reject(error) + + const tokenResponse = await httpClient.post('/api/v1/auth/login', { + "token": refreshToken, + "type": "REFRESH" + }) + + setAuthToken(tokenResponse.data) + + const accessToken = tokenResponse.data.accessToken + + error.config.headers['Authorization'] = `Bearer ${accessToken}`; + + return await httpClient.request(error.config) + } catch (e) { + return Promise.reject(e); + } + } + + return Promise.reject(error); + } +) diff --git a/adapter-in/admin/frontend/src/view/auth/AuthUtils.js b/adapter-in/admin/frontend/src/view/auth/AuthUtils.js index 33ff169c..bedd67d9 100644 --- a/adapter-in/admin/frontend/src/view/auth/AuthUtils.js +++ b/adapter-in/admin/frontend/src/view/auth/AuthUtils.js @@ -5,10 +5,28 @@ export function getAccessToken() { return localStorage.getItem("accessToken") } -export function setAccessToken(token) { +export function getRefreshToken() { + return localStorage.getItem("refreshToken") +} + +export function setAuthToken(tokenResponse) { + setAccessToken(tokenResponse.accessToken) + httpClient.defaults.headers['Authorization'] = `Bearer ${tokenResponse.accessToken}`; + + if (tokenResponse.refreshToken != null) { + setRefreshToken(tokenResponse.refreshToken) + } + +} + +function setAccessToken(token) { localStorage.setItem("accessToken", token) } +function setRefreshToken(token) { + localStorage.setItem("refreshToken", token) +} + const keyPermission = "permission" const emptyPermission = {groupList: []} diff --git a/adapter-in/admin/frontend/src/view/auth/GoogleLoginButton.js b/adapter-in/admin/frontend/src/view/auth/GoogleLoginButton.js index 057b4a66..c48ed138 100644 --- a/adapter-in/admin/frontend/src/view/auth/GoogleLoginButton.js +++ b/adapter-in/admin/frontend/src/view/auth/GoogleLoginButton.js @@ -1,7 +1,7 @@ import {GoogleLogin} from "@react-oauth/google"; import {GoogleOAuthProvider} from "@react-oauth/google"; import {httpClient} from "../../http/HttpClient"; -import {setAccessToken} from "./AuthUtils"; +import {setAuthToken} from "./AuthUtils"; const GoogleLoginButton = () => { const clientId = process.env.REACT_APP_GOOGLE_CLIENT_ID @@ -17,7 +17,7 @@ const GoogleLoginButton = () => { token: idToken }) - setAccessToken(response.data.accessToken) + setAuthToken(response.data) }} onFailure={(err) => { diff --git a/adapter-in/admin/frontend/src/view/auth/KakaoRedirect.js b/adapter-in/admin/frontend/src/view/auth/KakaoRedirect.js index df4debb2..5323b818 100644 --- a/adapter-in/admin/frontend/src/view/auth/KakaoRedirect.js +++ b/adapter-in/admin/frontend/src/view/auth/KakaoRedirect.js @@ -1,7 +1,7 @@ import {useLocation} from "react-router-dom"; import {httpClient} from "../../http/HttpClient"; import axios from "axios"; -import {setAccessToken} from "./AuthUtils"; +import {setAccessToken, setAuthToken, setRefreshToken} from "./AuthUtils"; export function KakaoRedirect() { const location = useLocation() @@ -30,7 +30,7 @@ export function KakaoRedirect() { "type": "KAKAO_ACCESS_TOKEN" }) - setAccessToken(tokenResponse.data.accessToken) + setAuthToken(tokenResponse.data) window.location.href = process.env.REACT_APP_BASE_PATH; }