2017-01-09 8 views
1

私は、ユーザーが要求がログアウト手順中に送信されていない

<a class="dropdown-item" (click)=authService.logout() href="/welcome">Log out</a> 

ログアウト]メニュー項目をクリックすると単純なAngular2アプリを、持っている、AuthenticationServicesのlogout()方法は

logout() { 
    alert('loging out'); 
    this.authHttp.post(this.endpoint_url + '/auth/logout','').map(res => { 
    if(res.status == 204) alert('logout successful'); 
    else alert('logout failed'); 
    }); 

    this.currentUser = null; 
    localStorage.removeItem('token'); 
} 

を実行問題が一部であります

this.authHttp.post(this.endpoint_url + '/auth/logout','').map(res => { 
    if(res.status == 204) alert('logout successful'); 
    else alert('logout failed'); 
    }); 

は実行されていないようです。 authHttp(angular2-jwt)で保護されたAPIにアクセスすると、アプリケーションの他の部分で問題なく動作します。
最初の警告「ログアウト」が表示され、ユーザーはログアウトして「/ welcome」にリダイレクトされ、APIのプライベート部分にアクセスできなくなります。ただし、ブラウザーやサーバーログに「/ auth/logout」を要求することはありません。

canActivate() { 
//loggedIn() {!(this.currentUser == null);} 
if (!this.auth.loggedIn()) { 
    this.router.navigate(['/welcome']); 
    return false; 
} 
return true; 
} 

答えて

1

あなたは彼らに「火」の順序で観測にsubscribeする必要があります。


任意の非ログインユーザーをリダイレクトAuthGuardサービスもあります。

this.authHttp.post(this.endpoint_url + '/auth/logout','').subscribe((res)=>{ 
    if(res.status == 204){ 
    alert('logout successful'); 
    this.currentUser = null; 
    localStorage.removeItem('token'); 
    }else {alert('logout failed');}   
}); 

そして、あなたがログアウトした後にトークンを削除する必要がある場合は、あなたが関数コールバック(subscribe)の内部でこれを実行する必要が成功しています。

+0

はい、それは他の回答(クリックイベントのキャンセル)とともに(部分的に)役立ちました。今度は実行されますが、トークンが削除された後に失敗します。 – wondra

+0

ああ後でトークンを削除しますか?更新された回答を確認してください。あなたres.status内のトークンを削除することができます== 204またはサブスクリプション内の好きなところ – echonax

+0

他の問題は、他のコンポーネントの別のエラーのために動作しているように見えた誤って構成されたjwtと組み合わせて、サーバー側にあった)。元の問題のすべては 'subscribe'を使用していませんでした。また、イベントをキャンセルしないでください。 – wondra

関連する問題