2016-07-11 17 views
0

要求ごとにAuthorizationヘッダーにJson Webトークンを渡し、ローカルストレージに格納します。ユーザーが「ログアウト」をクリックすると、ローカルストレージ内のトークンが削除され、コンソールにもトークンが記録され、Nullと表示されます。しかし、次のリクエストでは、Authorizationヘッダーは削除されてもJson Webトークンを使用します。ブラウザ上のリフレッシュボタンを押すまでは有効にならず、リクエストは更新された値を使用して開始されます。私はAngular.jsでシングルページアプリケーションを構築しています。ローカルストレージから削除されたJson Webトークンを依然として使用している承認ヘッダー

これは私は、ローカルストレージを設定しています方法である:

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.'); 
     } 
     }); 

これは私がAuthorizationヘッダを設定し、ローカル・ストレージを削除しています方法である:私は上記の方法を使用して各ページに

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'); 
     } 

    }; 

}); 

ユーザーが有効かどうかを確認するためのUser.getMe()。だから問題の1つは、ユーザーが自分のプロフィールにログインした後にログアウト(ストレージを削除)した場合、ホームページにリダイレクトされますが、ホームページでは "User.getMe()"を使用してユーザーがログインし、Authorizationヘッダーは引き続き古いJWTを使用しているため、ユーザーがログインしていると表示されます。これは、手動でページを更新するときにのみ機能します。

私は何時間も見つけられず、何も見つかりませんでした。コンソールにlocalstorageから 'jwt'を記録すると、nullと表示されますが、Chromeのデベロッパーツールでリクエストを確認すると、依然として古いjsonウェブトークンをリクエストが使用されていることがわかります。

私はおそらくページがキャッシュされていると思っていたので、キャッシュをオフにしようとしましたが、それは助けになりませんでした。

ご協力いただきましてありがとうございます。

答えて

1

理由は既に$http.defaults.headersに割り当てられているためです。

この時点で、格納されたトークンを削除または変更すると、デフォルトのヘッダーに何も行われません。ヘッダーを設定するhttpInterceptorを使用し

はあなたがcofigブロック内app.jsで場所が必要この

+1

'$ httpProvider.interceptors'にプッシュされるファクトリを作成しません。 $ http docsの "interceptors"セクションを参照してください – charlietfl

+0

今後はあなたはより専門的なレベル – charlietfl

-1

の周りになるだろう。

関連する問題