Для моего приложения на основе протокола мне нужно убедиться, что перед каждым запросом на выборку на сервер должен выполняться приведенный ниже вариант использования
-> проверить дату истечения срока действия токена, который сохраняется в 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
документации и пока не уверен, действительно ли я реализую логику промежуточного программного обеспечения?