0

안녕하세요 나는 토큰과 AuthHttp 호출을 가로 채는 인터셉터를 새로 고치기 위해 서비스 AuthenticationService가 있습니다. 문제는 호출이 실패 할 때 interceptor 메소드에서 refreshtoken 호출이 observable을 구독하는 것입니다. 내가 응답을 얻을 때 나는이 일을 얻을 만들어진 최초의 HTTP 호출을 호출하고 캔트해야 당신이 반환하는이 블록에내부에서 새로 고침 토큰 구독 - 앵글 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에 대한 요격이 Observablee. 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'); 
       } 
      ); 

     }