11import axios from 'axios' ;
2+ import { authStorage } from '@shared/utils/authStorage' ;
3+ import { extensionBridge } from '@shared/utils/extensionBridge' ;
4+
5+ const noAuthNeeded = [
6+ '/api/v1/auth/token' ,
7+ '/api/v3/auth/signup' ,
8+ '/api/v3/auth/google' ,
9+ '/api/v3/auth/reissue' ,
10+ ] ;
11+
12+ const reissueToken = async ( ) => {
13+ return await axios . post (
14+ `${ import . meta. env . VITE_BASE_URL } /api/v3/auth/reissue` ,
15+ { } ,
16+ {
17+ withCredentials : true ,
18+ }
19+ ) ;
20+ } ;
21+
22+ const syncAccessToken = ( token : string ) => {
23+ authStorage . setAccessToken ( token ) ;
24+ extensionBridge . syncToken ( token ) ;
25+ } ;
26+
27+ const clearAuthSessionAndRedirect = ( ) => {
28+ authStorage . clearSession ( ) ;
29+ extensionBridge . logout ( ) ;
30+ window . location . href = '/onboarding?step=SOCIAL_LOGIN' ;
31+ } ;
232
333// Axios 인스턴스
434const apiRequest = axios . create ( {
@@ -10,7 +40,7 @@ const apiRequest = axios.create({
1040
1141// 요청 인터셉터
1242apiRequest . interceptors . request . use ( async ( config ) => {
13- const token = localStorage . getItem ( 'token' ) ;
43+ const token = authStorage . getAccessToken ( ) ;
1444
1545 if ( token ) {
1646 config . headers . Authorization = `Bearer ${ token } ` ;
@@ -25,13 +55,6 @@ apiRequest.interceptors.response.use(
2555 async ( error ) => {
2656 const originalRequest = error . config ;
2757
28- const noAuthNeeded = [
29- '/api/v1/auth/token' ,
30- '/api/v3/auth/signup' ,
31- '/api/v3/auth/google' ,
32- '/api/v3/auth/reissue' ,
33- ] ;
34-
3558 const isNoAuth = noAuthNeeded . some ( ( url ) =>
3659 originalRequest . url ?. includes ( url )
3760 ) ;
@@ -48,30 +71,21 @@ apiRequest.interceptors.response.use(
4871 originalRequest . _retry = true ;
4972
5073 try {
51- const res = await axios . post (
52- `${ import . meta. env . VITE_BASE_URL } /api/v3/auth/reissue` ,
53- { } ,
54- {
55- withCredentials : true ,
56- }
57- ) ;
58-
59- const newAccessToken = res . data . data . token ;
60- localStorage . setItem ( 'token' , newAccessToken ) ;
61-
62- window . postMessage (
63- { type : 'SET_TOKEN' , token : newAccessToken } ,
64- window . location . origin
65- ) ;
74+ const res = await reissueToken ( ) ;
75+ const newAccessToken = res . data ?. data ?. token ;
76+
77+ if ( ! newAccessToken ) {
78+ throw new Error ( '토큰 재발급 응답에 access token이 없습니다.' ) ;
79+ }
6680
81+ syncAccessToken ( newAccessToken ) ;
82+ originalRequest . headers = originalRequest . headers ?? { } ;
6783 originalRequest . headers . Authorization = `Bearer ${ newAccessToken } ` ;
6884 return apiRequest ( originalRequest ) ;
6985 } catch ( reissueError ) {
7086 console . error ( '토큰 재발급 실패. 다시 로그인해주세요.' , reissueError ) ;
7187
72- localStorage . removeItem ( 'token' ) ;
73- localStorage . removeItem ( 'refreshToken' ) ;
74- window . location . href = '/onboarding?step=SOCIAL_LOGIN' ;
88+ clearAuthSessionAndRedirect ( ) ;
7589
7690 return Promise . reject ( reissueError ) ;
7791 }
0 commit comments