2017-04-12 9 views
0

私の角2のアプリケーションでは、ヘッダーに トークンを挿入して各要求を認証する必要があります。私は要求ヘッダーを作成し、 トークンを挿入するサービスを持っています。問題は、トークンを取得するメソッドが非同期であることです。したがって、以下のコードでは、トークン をヘッダに挿入する前にhttp getを実行します。Anugalur2 - 要求ヘッダーに認証トークンを注入する

トークンが処理されるまでhttpを待つように強制する良い方法はありますか?

コード:

getData(query: Vehicle): Observable<ResultWrapper> { 
     this.spinnerService.show(); 
     return this.http 
      .get(`${this.myService.apiEndpoint}/vehicles?name=${query.make}`, 
       { headers: this.myService.getHeaders() }) 
      .map(this.extractData) 
      .catch(this.exceptionService.catchBadResponse) 
      .finally(() => { 
       this.spinnerService.hide(); 
      }); 
    } 

myServiceという:

getHeaders(): any { 
    // this is call to an asynchronous javascript method 
    this.config.getToken(function (responseData) { 
     if (!responseData.error) { 
      responseData.headers.append('Authorization', "Bearer " + responseData.token); 
      return responseData.headers; 
     }); 
} 
+0

どのようにabt HTTPインターセプタ? あなたの前にあなたのreqを傍受し、ヘッダーを加えて行きます。 あなたのトークンに関連するコードがそのように単一の場所にあります。 –

+0

この記事では、インターセプタがAngular 2でサポートされていなかったというhttp://stackoverflow.com/questions/34464108/angular2-set-headers-for-every-requestについて述べました。また、httpクラスを拡張する例もありますが、ただし、認証呼び出しは依然として同期しています。 – noobie

答えて

0

あなたは確かに修正をうまくすることができます - しかし、多分これを実装するためのより良い方法があります。たとえば、Authサービス(myService)はキャッシュされたトークンを保持し、リクエスタに渡します(たとえば、getStatus.getItem( 'auth_token')を返すgetAccessToken()メソッド)。そして、あなたは次に、あなただけのトークンの有効期限が切れたときのためのgetDataの呼び出し(コード401)でエラーをトラップする必要がありますし、単に新しいものを要求

let headers = new Headers({ 'Authorization': 'Bearer ' + this.myService.getAccessToken() }); 

のようなものを使用します。

関連する問題