Skip to content

Commit

Permalink
Merge pull request #280 from Team-Ampersand/fix/token-refresh
Browse files Browse the repository at this point in the history
🔀토큰 오염 에러 해결
  • Loading branch information
Ethen1264 authored Aug 22, 2024
2 parents a94a1d5 + 0cbff99 commit 7080eab
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 19 deletions.
21 changes: 15 additions & 6 deletions src/api/member.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { GetServerSidePropsContext } from 'next';
import { toast } from 'react-toastify';
import { apiClient } from 'utils/Libs/apiClient';
import { removeToken } from 'utils/Libs/removeToken';
import { MemberController } from 'utils/Libs/requestUrls';
import { setToken } from 'utils/Libs/setToken';
import { setCookie } from 'nookies';

export const signin = async (id: string, password: string) => {
try {
Expand Down Expand Up @@ -149,12 +149,21 @@ export const tokenReissue = async (
}
);
newAuthorization = data.accessToken;
setCookie(ctx, 'Authorization', `Bearer ${newAuthorization}`, {
expires: data.accessExp,
path: '/',
});
refreshToken = data.refreshToken;
setToken(
data.accessToken,
data.accessExp,
data.refreshToken,
data.refreshExp,
null
);
return { newAuthorization };
} catch (e: any) {}
} catch (e: any) {
removeToken();
if (typeof window !== 'undefined') {
window.location.href = '/signin';
}
}
};

export const postProfileImage = async (image: Blob | string) => {
Expand Down
39 changes: 38 additions & 1 deletion src/utils/Libs/apiClient.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,47 @@
import axios from 'axios';
import BASE_HEADER from '../Config/Config.json';
import { getRefresh } from './getRefresh';
import { tokenReissue } from 'api/member';
import { MemberController } from './requestUrls';
import { setToken } from './setToken';
import { getToken } from './getToken';

export const apiClient = axios.create({
baseURL: process.env.NEXT_PUBLIC_BASE_URL,
headers: BASE_HEADER,
});

apiClient.interceptors.request.use(getRefresh);
apiClient.interceptors.response.use(
function (response) {
return response;
},
async function (err) {
const originalRequest = err.config;

if (
err.response &&
(err.response.status === 401 || err.response.status === 403) &&
!originalRequest._retry
) {
originalRequest._retry = true;

try {
const { RefreshToken } = await getToken(null);
const tokenResponse = await tokenReissue(
'Bearer ' + RefreshToken,
null
);

if (tokenResponse && tokenResponse.newAuthorization) {
originalRequest.headers['Authorization'] =
'Bearer ' + tokenResponse.newAuthorization;
return apiClient(originalRequest);
}
} catch (refreshError) {
return Promise.reject(refreshError);
}
}

return Promise.reject(err);
}
);
7 changes: 6 additions & 1 deletion src/utils/Libs/getRefresh.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import { AxiosRequestConfig } from 'axios';
import { tokenReissue } from '../../api/member';
import { getToken } from './getToken';
import { MemberController } from './requestUrls';

export const getRefresh = async (config: AxiosRequestConfig) => {
if (typeof window !== 'object') return config;
const { Authorization, RefreshToken } = await getToken(null);

if (config.headers && Authorization) {
if (
config.headers &&
Authorization &&
!config.url?.includes(MemberController.auth)
) {
config.headers['Authorization'] = Authorization;
} else if (
!Authorization &&
Expand Down
11 changes: 0 additions & 11 deletions src/utils/Libs/getToken.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,6 @@ export const getToken = async (ctx: GetServerSidePropsContext | null) => {
if (ctx) {
let Authorization = ctx.req.cookies['Authorization'] || '';
let RefreshToken = ctx.req.cookies['RefreshToken'] || '';

if (!RefreshToken) return {};
if (!Authorization) {
try {
const response = await tokenReissue(RefreshToken, ctx);
Authorization = response?.newAuthorization || '';
} catch {
return {};
}
}

return { Authorization, RefreshToken };
} else {
const { Authorization, RefreshToken } = parseCookies();
Expand Down

0 comments on commit 7080eab

Please sign in to comment.