2016-05-25 10 views
6

私はRC1を新しいルータで使用しています(廃止予定のルータではありません)。角2 - JWT認証

ほとんどのブログとドキュメントを読んだことがありますが、特に「新しい」ルータではなく、慣用的なやり方を見つけることができませんでした。これまでのところ私はちょうどカップルの事を逃し、「完璧」私のアプリを働いてきた:

  1. にはどうすればすべての単一のHTTPリクエストに応じてAuthorizationヘッダーにトークンを追加して行くべきですか?
  2. 40xの応答を傍受し、必要に応じて(ルートが保護されていることを意味する)別のURLにナビゲートするにはどうすればよいですか?
  3. ユーザーがログインしていない場合にアプリケーションがログインURLにナビゲートするように、ルート(またはコンポーネント)を設定するにはどうすればよいですか?
  4. ボーナス:メインコンポーネントのコンストラクターに基本ユーザーデータを読み込むのは慣れていますか?

私は完全なデモやそのようなものは必要ありません。

答えて

2

私はしませんので、ずっと前に同じ問題に対処しなければならなかったし、次の解決策を考え出しました。

組み込みのHttpサービス用のラッパーサービスを作成しました。これはベストプラクティスかどうかわかりませんが、Angular 1のインターセプターがこれの解決策として本当に好きでした。 Httpを使用したい場合は、代わりにこのサービスを注入します。

@Injectable() 
export class HttpWrapper { 
    constructor(private loginService:LoginService, private http:Http, private router:Router) { 
    } 

    get(url: string, options?: RequestOptionsArgs): Promise<Response> { 
     let promise: Promise<Response> = this.http.get(url, this.addHeaders(options)).toPromise(); 
     return new Promise((resolve, reject) => { 
      promise.then(success => { 
       resolve(success); 
      }, error => { 
       this.onError(error); 
       reject(error); 
      }); 
     }); 
    } 

    //... repeat the same concept for post, put, delete... 

    private addHeaders(otherOptions?: RequestOptionsArgs): RequestOptions { 
     let headers = new Headers({'Content-Type': 'application/json', token: this.loginService.token}); 
     let options = new RequestOptions({ headers: headers }); 
     if (otherOptions) { 
      options.merge(otherOptions); 
     } 
     return options; 
    } 

    private onError(reason) { 
     if(reason.status === 401) { 
      this.router.navigateByUrl(`/login?${encodeURIComponent(this.router.lastNavigationAttempt)}`); 
     } 
    } 
} 

※廃止予定のルータを使用しています。私はAngularチームが新しいものを正しく文書化するのを待っています。

私はこれがあなたの質問1-3にかなり答えると思います。ボーナスに関する質問は、ユースケースの問題です。いずれにしてもユーザーのデータを使用することがわかっている場合は、ユーザーのデータを事前にロードすることが理にかなっています。それ以外の場合は、開始時にアプリケーションを正しくオーバーロードしないために、必要なときにのみこのデータをロードすることができます。

2

基本的なトークン認証を実装するAngular 2 Authを見て、権限がない場合はログインページへのルーティングを扱うことができます。それは廃止されたルータ(私が推測する)ですが、あなたはそのアイデアを得ます。

https://github.com/teonite/angular2-auth