Erstellen eines Anmeldeformulars mit Reactjs, Redux, Axios und Redux-Thunk. Ich habe zwei Tokens - eine mit dem Namen access token
und refresh token
.Authentifizierung Aktualisieren Token
Wenn der Benutzer authentifiziert ist, speichern Sie die access token
, die für 12 Stunden dauern soll. Die refresh token
ist ebenfalls vorgesehen und wird 30 Tage dauern.
Sobald die access token
abgelaufen ist, müssen Sie den Zeitstempel (Datum) überprüfen, wenn access token
abgelaufen ist. Wie kann ich die access token
einmal abgelaufen aktualisieren? Token-Daten wie folgt aussehen, so habe ich einen Zeitstempel überprüfen gegen:
{
"access_token": "toolongtoinclude",
"token_type": "bearer",
"refresh_token": "toolongtoinclude",
"expires_in": 43199,
"scope": "read write",
"roles": [
"USER"
],
"profile_id": "b4d1e37d-7d05-4eb3-98de-0580d3074a0d",
"jti": "e975db65-e3b7-4034-a6e4-9a3023c3d175"
}
Hier sind meine Aktionen zu speichern, und Update-Token aus dem Speicher. Ich bin mir nicht sicher, wie ich das Token aktualisieren soll.
export function submitLoginUser(values, dispatch) {
dispatch({type: constants.LOADING_PAGE, payload: { common: true }})
return axios.post(Config.API_URL + '/oauth/token', {
username: values.email,
password: values.password,
scope: Config.WEBSERVICES_SCOPE,
grant_type: Config.WEBSERVICES_GRANT_TYPE_PASSWORD
},
{
transformRequest: function (data) {
var str = [];
for (var p in data) {
str.push(encodeURIComponent(p) + '=' + encodeURIComponent(data[p]));
}
return str.join('&');
},
headers: {
'Authorization': 'Basic ' + window.btoa(Config.WEBSERVICES_AUTH),
'Content-Type': 'application/x-www-form-urlencoded'
}
})
.then(response => {
const {access_token, refresh_token} = response.data;
dispatch({type: constants.LOADING_PAGE, payload: { common: false }})
dispatch({
type: constants.LOGIN_SUCCESS,
payload: {
access_token: access_token,
refresh_token: refresh_token
}
});
saveTokens(response)
browserHistory.push('/questions');
refreshToken(response);
})
.catch(error => {
dispatch({type: constants.LOADING_PAGE, payload: { common: false }})
//401 Error catch
if(error.response.status === 401) {
throw new SubmissionError({username: 'User is not authenticated', _error: message.LOGIN.loginUnAuth})
}
//Submission Error
throw new SubmissionError({username: 'User does not exist', _error: message.LOGIN.loginFailed})
})
}
/**
* Save tokens in local storage and automatically add token within request
* @param params
*/
export function saveTokens(params) {
const {access_token, refresh_token} = params.data;
localStorage.setItem('access_token', access_token);
if (refresh_token) {
localStorage.setItem('refresh_token', refresh_token);
}
//todo fix this later
getinstanceAxios().defaults.headers.common['Authorization'] = `bearer ${access_token}`
}
/**
*
*/
export function getTokens() {
let accessToken = localStorage.getItem('access_token');
return accessToken
}
/**
* update the get requests
*/
export function updateTokenFromStorage() {
const tokenLocalStorage = getTokens();
getinstanceAxios().defaults.headers.common['Authorization'] = `bearer ${tokenLocalStorage}`;
}
/**
* Refresh user access token
*/
export function refreshToken(dispatch) {
//check timestamp
//check access expired - 401
//request new token, pass refresh token
//store both new access and refresh tokens
}
zu testen, kein Protokoll zurückbekommen, warum keine Abfangjäger auf alle Ihre Anfragen erstellen. Dieser Interceptor wird prüfen, ob dein Token noch gültig ist oder nicht, weißt du? Falls nicht, senden Sie eine neue Route oder zeigen Sie eine Nachricht an. –
Vielen Dank für diesen Valter - ich werde in Abfangjäger für Axios schauen. – Filth