Маркер обновления промежуточного программного обеспечения Redux вызывается после запроса Axios в создателе действия - PullRequest
0 голосов
/ 12 октября 2019

Я создаю избыточное промежуточное программное обеспечение для обновления токена перед любым запросом, если срок действия токена истек.
Проблема в том, что после первого вызова я всегда получаю error 400 bad request, но если выполнялся другой вызов (это разбиение на страницыrequrest) он работает нормально, потому что токен был обновлен.
Я заметил, что запрос Axios запускается до того, как новый токен поступает, и до установки нового заголовка авторизации Axios, поэтому я попытался сделать промежуточное ПО асинхронным ожиданием, но все жене повезло ...

import {
    getJWT,
    isTokenExpired
} from "../util/helpers";
import Cookies from "js-cookie";
import axios from "axios";

const refreshTokenMiddleware = store => next => async action => {
    if (!action.excludeFromRefresh) {
        const token = getJWT();
        if (token && isTokenExpired()) {
            try {
                const { data } = await axios.post("auth/refresh");
                axios.defaults.headers.common[
                    "Authorization"
                ] = `Bearer ${data.data.access_token}`;
                Cookies.set("AppToken", data.data.access_token);
                next(action);
            } catch (error) {
                console.log(error);
            }

        } else {
            next(action);
        }
    } else {
        next(action);
    }
};

export default refreshTokenMiddleware;

Я также подозреваю, что запрос Axios вызывается со старым токеном в первый раз.
Что я здесь не так делаю?

=====================

Редактировать

Я попытался объединить промежуточное программное обеспечение все вместе и реализовать перехватчики axios, так как промежуточное программное обеспечение неперехватить запрос axios ...

axios.interceptors.request.use(
    function(config) {
        // Do something before request is sent
        if (
            config.url !== "auth/refresh" &&
            config.url !== "auth/login" &&
            config.url !== "auth/register"
        ) {
            const token = getJWT();

            if (token && isTokenExpired()) {
                axios.post("auth/refresh").then(res => {
                    config.headers.Authorization = `Bearer ${res.data.data.access_token}`;
                    console.log(
                        "Inside the refresh in interceptor",
                        res.data.data.access_token
                    );
                    return config;
                });
            }
        }
        return config;
    },
    function(error) {
        // Do something with request error
        return Promise.reject(error);
    }
);

Но это также, похоже, не работает, запрос запускается со старым токеном в заголовке авторизации в первый раз.

Что можетЯ делаю?

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Для всех, кто интересуется этой публикацией, мне удалось решить эту проблему с помощью этой Axios interceptor ... https://gist.github.com/Godofbrowser/bf118322301af3fc334437c683887c5f

0 голосов
/ 12 октября 2019

На первый взгляд, это if утверждение как-то неверно, потому что вы пытаетесь проверить, есть ли в URL три разных значения одновременно, я думаю, вам следует использовать здесь оператор ||.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...