Angular2 http " retry-Logik
Habe ich eine API mit token-basierte Authentifizierung-Mechanismus. Nach erfolgreicher signin Speicher ich zwei Token im browser das lokale storage - access-und refresh-Tokens.
Das access token enthält alle erforderlichen Informationen zur Autorisierung eines Benutzers auf der server-Seite und es hat Ablaufdatum.
Wenn der access-token ist abgelaufen, der client kann die Anforderung eines neuen access-token mit refresh-token und in der Antwort wird es ein paar neue tokens.
In den Winkel-1.x die Umsetzung ist ziemlich einfach und unkompliziert. Zum Beispiel könnten wir Abfangjäger:
httpInterceptor.$inject = ['$httpProvider'];
function httpInterceptor($httpProvider) {
$httpProvider.interceptors.push(handleStaleAccessToken);
handleStaleAccessToken.$inject = ['$q', '$injector', 'session'];
function handleStaleAccessToken($q, $injector, session) {
function logoutAndRedirect() {
var authenticationRedirect = $injector.get('authenticationRedirect');
session.destroy();
authenticationRedirect.toLoginPage();
}
return {
responseError: function(rejection) {
//Do nothing for non 403 errors
if (rejection.status !== 403) {
return $q.reject(rejection);
}
var errorCode = rejection.data.error && rejection.data.error.code;
if (errorCode === 'access_token_expired') {
var $http = $injector.get('$http');
//Refresh token
var params = { refreshToken: session.getRefreshToken() };
return $http.post('/api/auth/refresh', params).then(function(response) {
session.setTokens(response.data);
//Re try failed http request
return $http(rejection.config);
}).catch(function(error) {
logoutAndRedirect();
return $q.reject(error);
});
} else {
logoutAndRedirect();
}
return $q.reject(rejection);
}
};
}
}
Aber, wie bei der Durchführung ähnlicher Logik im Winkel 2 /rxjs app?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese kann getan werden, transparent in Angular2 durch die Verlängerung der
Http
Klasse und unter Nutzung beobachtbarer Operatoren wieflatMap
.Ist hier einige Beispiel-code:
Dieser code muss eingebunden werden in eine eigene sub-Klasse der
Http
eins:Ein Ansatz wäre die Ausweitung der HTTP-Objekt abzufangen Fehler:
und registrieren Sie es wie unten beschrieben:
Weitere details haben Sie einen Blick auf diese Fragen:
Hatte ich etwas ähnliches in meinem letzten Projekt shafihuzaib/cdp-ng-boilerplate und landete auf diese Frage für meine Antwort. Ich konnte nicht gehen, für die oben vorgeschlagene Lösung, wie es fühlte sich kompliziert und etwas, was nicht wünschenswert ist. So kam ich zurück zu lassen, meine Lösung, nachdem ich implementiert ein. Allerdings mit dem Unterschied, dass in meinem Fall, ich hatte zwei dieser tokens.
So, wird jede Anforderung, die Bedürfnisse zu haben-Token' Gültigkeit überprüft, ist aufgerufen, in dieser Funktion.
Das wichtigste hier ist, dass
func()
zurückgeben sollte eineObservable
, so dass es verbraucht werden kann, entsprechend.Es scheinen mag ein wenig kompliziert für jemand neues, aber ich bin sicher, es ist ein wenig effizienter.
In den folgenden links, bitte ignorieren Sie die details, die irrelevant für diese Frage und konzentrieren sich auf die Nutzung der vorgeschlagenen Lösung.
Die tatsächliche Implementierung von
tokenValidatedRequest()
in meinem Projekt.Wie ist es in anderen Dienstleistungen!
Wie ich endlich zu abonnieren!