2016-07-11 5 views
0

Ich übergebe ein Json Web Token im Authorization Header bei jeder Anfrage und speichere es im lokalen Speicher. Wenn der Benutzer auf "Abmelden" klickt, löscht er das Token im lokalen Speicher und ich logge es sogar in der Konsole ein und es sagt null. Aber bei den nächsten Anfragen wird der Authorization-Header weiterhin das Json-Web-Token verwenden, obwohl es gelöscht wurde. Erst nachdem ich den Refresh-Button im Browser gedrückt habe, wird er wirksam und die Anfragen beginnen, den aktualisierten Wert zu verwenden. Ich baue eine Single Page App mit Angular.js.Berechtigungsheader verwendet immer noch gelöschten Json Web Token aus lokalem Speicher

Dies ist, wie ich die lokale Speicherung bin Einrichtung:

User.authUser($scope.credentials).then(function(res) { 

     console.log(res); 

     if(res.success === true){ 

       console.log('User is authenticated!'); 
       localStorage.setItem('jwt', JSON.stringify(res.token)); 

     } else { 

     console.log('User is NOT authenticated.'); 
     } 
     }); 

Dies ist, wie ich den Authorization-Header und Löschen von lokalen Speichern an Einstellung:

angular.module('App.user', []) 
    .factory('User', function($http, $location, $state, $window) { 

    var jwt = localStorage.getItem('jwt'); 

    $http.defaults.headers.common.Authorization = JSON.parse(jwt); 

    var apiUrl = 'http://localhost:8080/api'; 

    return { 


    authUser: function(credentials) { 
     return $http.post(apiUrl + '/authenticate', credentials).then(function(res){ 
      return res.data; 
     }); 
    }, 

    getMe: function() { 
     return $http.get(apiUrl + '/users/me').then(function(res) { 
      return res.data; 
     }); 
    }, 

     logOut: function(){ 
      console.log('Logging user out'); 
      localStorage.removeItem('jwt'); 
      $state.go('home'); 
     } 

    }; 

}); 

Auf jeder Seite i die oben beschriebene Methode verwenden User.getMe() um zu überprüfen, ob der Benutzer gültig ist. Eines der Probleme ist also, wenn der Benutzer bei seinem Profil angemeldet ist und dann abmeldet (was den Speicher löscht), werden sie auf die Homepage umgeleitet, ABER die Homepage verwendet "User.getMe()", um zu prüfen, ob der Benutzer ist eingeloggt und da der Authorization-Header immer noch den alten JWT verwendet, heißt es, dass der Benutzer eingeloggt ist. Er funktioniert nur, wenn ich die Seite manuell aktualisiere.

Ich habe mehrere Stunden lang gegoogled und kann nichts finden. Als ich die 'jwt' von localstorage in der Konsole loggte, sagt es null, aber wenn ich die Anfragen in den Entwicklerwerkzeugen von Chrome überprüfe, zeigt es an, dass die Anfragen noch das alte json NetzToken verwenden.

Ich dachte, vielleicht wurden die Seiten zwischengespeichert und das war der Grund, warum ich versuchte, Caching zu deaktivieren, aber das half nicht.

Jede Hilfe wird geschätzt!

Antwort

1

Der Grund ist, dass Sie es bereits $http.defaults.headers zugewiesen haben.

An diesem Punkt wird das Entfernen oder Ändern des gespeicherten Tokens die Standard-Header nicht ändern.

ein httpInterceptor Mit Header setzen, um dieses

+1

Nein, Sie erstellen eine Factory, die in '$ httpProvider.interceptors' verschoben wird. Siehe "Interceptors" Abschnitt von $ http Docs – charlietfl

+0

Beachten Sie auch, dass Sie gestern sagte mir, ich wusste nichts über eckig und googelte um meine Antworten zu finden – charlietfl

+0

Nur erwähnt, dass Sie in Zukunft so Dinge auf professioneller Ebene halten – charlietfl

-1

Sie müssen in app.js innerhalb cofig Block erhalten würde.

Verwandte Themen