0

私はトークンをリフレッシュするためのAuthenticationServiceと、AuthHttpコールを傍受するインターセプタを持っています。問題は、コールが失敗したときのインターセプタメソッドで、私はrefreshTokenコールを私が作った、それが仕事を得るカント最初のHTTP呼び出しを呼び出す必要が応答を取得する場合:あなたが戻ってきている。このブロックで内部リフレッシュトークンを再試行します。subscribe - angular 4

request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 
    return this.intercept(super.request(url, options)); 
    } 

intercept(observable: Observable<Response>): Observable<Response> { 

    return observable.catch((err, source) => { 

     if (this.isUnauthorized(err.status)) { 
     //logout the user or do what you want 
      this.authService.refreshToken().subscribe(result => { 
        if(!result){ 
        } 
        HERE THE FIRST FAILED CALL MUST BE CALLED 
       }, 
       err => { 
       } 
      ); 
     if (err instanceof Response) { 
      return Observable.throw(err.json().message || 'backend server error'); 
     } 
     return Observable.empty(); 
     } else { 
     return Observable.throw(err); 
     } 
    }) 

    } 
+0

が空のリターンを得ることだと思います。最初の呼び出しがb/cに失敗した場合、トークンは期限切れです。それを更新するには遅すぎるでしょうか?サーバーは、現在認証されていない人に新しいトークンを発行しても問題ないことをどのようにして知ることができますか?私のアプリではトークンは*使用できなくなる前にリフレッシュされます*。 – BeetleJuice

+0

有効期限が切れた有効なトークンを持っていて、リフレッシュが1週間以内にしか行えないように、有効期限が切れたトークンがブラックリストにある場合(つまり期限切れのトークンを更新する必要がある) –

+0

これは問題があるようです。基本的に、サーバーは、ユーザーが本物であることを証明するものとして期限切れのトークンを受け入れます。有効期限が過ぎても、認証が必要なもの(たとえば、有効なトークンを取得する)に対してトークンを受け入れないようにする必要はありませんか? – BeetleJuice

答えて

0

refreshToken(): Observable<any>{ 
    return this.authHttp.get(GLOBAL.apiurl+'/refresh-token',"").map(
      (response) => { 
        let token = response.json() && response.json().token; 
        if (token){ 
         console.log('refresh token'); 
         localStorage.setItem('token', token); 
         return true; 
        } 
        else{ 
         console.log('no token'); 
         this.resetLocalStorage(); 
         return false; 
        } 
       } 
    ); 
} 

をそれから私はauthttpのためのインターセプタを持っていますObservable.e mpty();非同期呼び出しの外では、これをサービス呼び出しの中に割り当てる必要があると思います。私はあなたがサービスコールを待たずに観察を返してきたように、今あなたが(下記のあなたの要件に基づいて、それを修正する必要があるかもしれません擬似コードされる)興味があるだけ

if (this.isUnauthorized(err.status)) { 
     //logout the user or do what you want 
      this.authService.refreshToken().subscribe(result => { 
        if(!result){ 
        } 
        HERE THE FIRST FAILED CALL MUST BE CALLED 
        // your return must be somewhere here 
        return Observable.empty(); 
       }, 
       err => { 
        return Observable.throw(err.json().message || 'backend server error'); 
       } 
      ); 

     } 
関連する問題