| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- import axios from "axios";
- import jwt_decode from "jwt-decode";
- import { JWT_REFRESH_TOKEN, JWT_TOKEN } from "../../constants/localStorage";
- import { attachBeforeRequestListener } from "../../request/index";
- import { getData } from "../../service/asyncStorage";
- import { logoutUser, refreshUserToken } from "../actions/login/loginActions";
-
- export const accessTokensMiddlewareInterceptorName = "ACCESS_TOKEN_INTERCEPTOR";
-
- export default ({ dispatch }) =>
- (next) =>
- (action) => {
- attachBeforeRequestListener(async (response) => {
- const jwtToken = await getData(JWT_TOKEN);
- const refresh = await getData(JWT_REFRESH_TOKEN);
- if (!jwtToken || !refresh) return Promise.resolve(response);
- const jwtTokenDecoded = jwt_decode(jwtToken);
- const refreshTokenDecoded = jwt_decode(refresh);
- if (!response.headers?.Authorization) {
- response.headers.Authorization = `Bearer ${jwtToken}`;
- }
-
- // If refresh token is expired, log out user
- if (new Date() > new Date(refreshTokenDecoded?.exp * 1000)) {
- dispatch(logoutUser());
- return Promise.resolve(response);
- }
-
- // If access token is expired, refresh access token
- if (new Date() > new Date(jwtTokenDecoded.exp * 1000)) {
- const axiosResponse = await axios.post(
- "https://strapi.dilig.net/api/token/refresh",
- {
- refreshToken: refresh,
- },
- {
- headers: { Authorization: `Bearer ${jwtToken}` },
- }
- );
- const newToken = axiosResponse.data;
-
- response.headers.Authorization = `Bearer ${newToken.jwt}`;
-
- dispatch(refreshUserToken(newToken));
- }
-
- return Promise.resolve(response);
- }, accessTokensMiddlewareInterceptorName);
-
- next(action);
- };
|