私の反応ネイティブアプリでは、サーバーへのすべてのフェッチリクエストの前に、以下のユースケースを実行する必要があることを確認する必要があります
-> 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
ミドルウェアロジックを本当に実装しているかどうかまだわかりませんか?