react-native — проверять срок действия jwt с промежуточным программным обеспечением redux-thunk перед каждым вызовом API

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

-> проверьте дату истечения срока действия токена, сохраненного в Redux.

--> Если срок действия токена не истек, приложение продолжает работу с запрошенным fetch на сервер

--> Если срок действия токена истек, приложение немедленно делает новый запрос к refresh token, не сообщая об этом пользователю. После успешного обновления токена приложение продолжает работу с запрошенным fetch на сервер

Я пытался реализовать промежуточное ПО с помощью redux-thunk, но не знаю, хороший это дизайн или нет. Мне просто нужен кто-то, кто имеет опыт работы с redux и react, чтобы дать мне отзыв о моем промежуточном коде.

Вот как я делаю запросы к серверу над компонентом моего приложения, отправляя checkTokenAndFetch - создатель действий.

url = "https://———————";
requestOptions = {
    method: 'GET',
    headers: {
        'Authorization': 'Bearer ' + this.props.token
    }
};

dispatch(authActions.checkTokenAndFetch(url, requestOptions))
    .then((data) => {

    })

вот создатель действия - checkTokenAndFetch находится в файле authActions.js, где находится мой actions

function checkTokenAndFetch(url, requestOptions){

        return dispatch => {

        if(authServices.isTokenExpired()){
            console.log("TOKEN EXPIRED");
            authServices.refreshToken()
                .then(
                    refreshToken => {
                        var arr = refreshToken.split('.');
                        decodedToken = base64.decode(arr[1]);
                        newTokenExpDate = JSON.parse(decodedToken).exp;
                        dispatch(writeTokenToRedux(refreshToken,newTokenExpDate));
                    },
                    error => {
                        Alert.alert("TOKEN refresh failed","Login Again");
                        Actions.login();

                    }
                );
        }
        else{
            console.log("TOKEN IS FRESH");
        }

        return authServices.fetchForUFS(url, requestOptions)
            .then(
                response => {
                    return response;
                },
                error => {
                }
            )
            ;
    }
}

Вот функции isTokenExpired и refreshToken, которые я вызываю в случае истечения срока действия токена, расположенные в другом файле с именем authServices.js.

function isTokenExpired(){
    var newState = store.getState();
    var milliseconds = (new Date).getTime();


    var exDate = newState.tokenExpDate;
    return milliseconds>exDate*1000
}


function refreshToken(){
    var refreshToken = store.getState();

    return fetch('https://—————————', {
        method: 'POST',
        headers: {
            'Accept': 'application/json',
            'Authorization': 'Bearer ' + refreshToken.token
        }
    })
        .then((response) => {
            return response._bodyText;
        })
        .catch((error) => {
        return error;
        })
}

и моя функция fetchForUFS в authServices.js для вызова сервера после завершения проверки токена (обновления).

function fetchForUFS(url,requestOptions){

    return fetch(url, requestOptions)
        .then((response) => {
            return response.json();
        })
        .then((responseData) =>{
        return responseData;
    })
        .catch((error) => {
        })
}

Я прочитал тонны документации redux-thunk, redux-promise и middleware, и я все еще не уверен, действительно ли я реализую логику промежуточного программного обеспечения?


person Ali Zeynalov    schedule 29.06.2018    source источник
comment
Все заслуги принадлежат этому человеку :) stackoverflow.com/questions/44982412/   -  person th3g3ntl3m3n    schedule 28.08.2018