Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

accessTokenMiddleware.js 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import axios from "axios";
  2. import jwt_decode from "jwt-decode";
  3. import { JWT_REFRESH_TOKEN, JWT_TOKEN } from "../../constants/localStorage";
  4. import { attachBeforeRequestListener } from "../../request/index";
  5. import { getData } from "../../service/asyncStorage";
  6. import { logoutUser, refreshUserToken } from "../actions/login/loginActions";
  7. export const accessTokensMiddlewareInterceptorName = "ACCESS_TOKEN_INTERCEPTOR";
  8. export default ({ dispatch }) =>
  9. (next) =>
  10. (action) => {
  11. attachBeforeRequestListener(async (response) => {
  12. const jwtToken = await getData(JWT_TOKEN);
  13. const refresh = await getData(JWT_REFRESH_TOKEN);
  14. if (!jwtToken || !refresh) return Promise.resolve(response);
  15. const jwtTokenDecoded = jwt_decode(jwtToken);
  16. const refreshTokenDecoded = jwt_decode(refresh);
  17. if (!response.headers?.Authorization) {
  18. response.headers.Authorization = `Bearer ${jwtToken}`;
  19. }
  20. // If refresh token is expired, log out user
  21. if (new Date() > new Date(refreshTokenDecoded?.exp * 1000)) {
  22. dispatch(logoutUser());
  23. return Promise.resolve(response);
  24. }
  25. // If access token is expired, refresh access token
  26. if (new Date() > new Date(jwtTokenDecoded.exp * 1000)) {
  27. const axiosResponse = await axios.post(
  28. "https://strapi.dilig.net/api/token/refresh",
  29. {
  30. refreshToken: refresh,
  31. },
  32. {
  33. headers: { Authorization: `Bearer ${jwtToken}` },
  34. }
  35. );
  36. const newToken = axiosResponse.data;
  37. response.headers.Authorization = `Bearer ${newToken.jwt}`;
  38. dispatch(refreshUserToken(newToken));
  39. }
  40. return Promise.resolve(response);
  41. }, accessTokensMiddlewareInterceptorName);
  42. next(action);
  43. };