22
33import axios from 'axios'
44
5+ const baseURL = 'http://127.0.0.1:8000/api/'
6+
57const axiosInstance = axios . create ( {
6- baseURL : 'http://127.0.0.1:8000/api/' ,
8+ baseURL : baseURL ,
79 timeout : 5000 ,
810 headers : {
911 'Authorization' : localStorage . getItem ( 'access_token' ) ? "JWT " + localStorage . getItem ( 'access_token' ) : null ,
@@ -12,54 +14,57 @@ const axiosInstance = axios.create({
1214 }
1315} ) ;
1416
17+
1518axiosInstance . interceptors . response . use (
1619 response => response ,
1720 error => {
18- const originalRequest = error . config ;
21+ const originalRequest = error . config ;
1922
20- if ( ! originalRequest . _retry ) {
21- originalRequest . _retry = true ;
22- // test for token presence, no point in sending a request if token isn't present
23- if ( error . response . data . code === "token_not_valid" && error . response . status === 401 && error . response . statusText === "Unauthorized" ) {
24- const refresh_token = localStorage . getItem ( 'refresh_token' ) ;
23+ // Prevent infinite loops early
24+ if ( error . response . status === 401 && originalRequest . url === baseURL + 'token/refresh/' ) {
25+ window . location . href = '/login/' ;
26+ return Promise . reject ( error ) ;
27+ }
2528
26- if ( refresh_token ) {
27- const tokenParts = JSON . parse ( atob ( refresh_token . split ( '.' ) [ 1 ] ) ) ;
29+ if ( error . response . data . code === "token_not_valid" &&
30+ error . response . status === 401 &&
31+ error . response . statusText === "Unauthorized" )
32+ {
33+ const refreshToken = localStorage . getItem ( 'refresh_token' ) ;
2834
29- // exp date in token is expressed in seconds, while now() returns milliseconds:
30- const now = Math . ceil ( Date . now ( ) / 1000 ) ;
31- console . log ( tokenParts . exp ) ;
35+ if ( refreshToken ) {
36+ const tokenParts = JSON . parse ( atob ( refreshToken . split ( '.' ) [ 1 ] ) ) ;
3237
33- if ( tokenParts . exp > now ) {
34- return axiosInstance
35- . post ( '/token/refresh/' , { refresh : refresh_token } )
36- . then ( ( response ) => {
37-
38- localStorage . setItem ( 'access_token' , response . data . access ) ;
39- localStorage . setItem ( 'refresh_token' , response . data . refresh ) ;
40-
41- axiosInstance . defaults . headers [ 'Authorization' ] = "JWT " + response . data . access ;
42- originalRequest . headers [ 'Authorization' ] = "JWT " + response . data . access ;
38+ // exp date in token is expressed in seconds, while now() returns milliseconds:
39+ const now = Math . ceil ( Date . now ( ) / 1000 ) ;
40+ console . log ( tokenParts . exp ) ;
4341
44- console . log ( "Tokens refreshed." )
45-
46- return axiosInstance ( originalRequest ) ;
47- } )
48- . catch ( err => {
49- console . log ( err )
50- } ) ;
42+ if ( tokenParts . exp > now ) {
43+ return axiosInstance
44+ . post ( '/token/refresh/' , { refresh : refreshToken } )
45+ . then ( ( response ) => {
46+
47+ localStorage . setItem ( 'access_token' , response . data . access ) ;
48+ localStorage . setItem ( 'refresh_token' , response . data . refresh ) ;
49+
50+ axiosInstance . defaults . headers [ 'Authorization' ] = "JWT " + response . data . access ;
51+ originalRequest . headers [ 'Authorization' ] = "JWT " + response . data . access ;
52+
53+ return axiosInstance ( originalRequest ) ;
54+ } )
55+ . catch ( err => {
56+ console . log ( err )
57+ } ) ;
58+ } else {
59+ console . log ( "Refresh token is expired" , tokenParts . exp , now ) ;
60+ window . location . href = '/login/' ;
61+ }
5162 } else {
52- console . log ( "Refresh token is expired" , tokenParts . exp , now ) ;
63+ console . log ( "Refresh token not available." )
64+ window . location . href = '/login/' ;
5365 }
54- } else {
55- console . log ( "Refresh token not available." )
56- }
57- } else {
58- console . log ( "Do other API intercepting unrelated to Token Refreshment here." )
5966 }
60- } else {
61- console . log ( "Too many retries." )
62- }
67+
6368
6469 // specific error handling done elsewhere
6570 return Promise . reject ( error ) ;
0 commit comments