1.構成
アプリケーションには特定の構成情報が必要になります。残りの実装作業に進む前に、さまざまな構成値を入れるAuthConfig
インターフェイスを作成してください。このインターフェイスは、auth0-variables.ts
というファイルに入れます。
2.ユーザーの認可
認可サービスの作成
ユーザー認証に必要なタスクを管理・調整する最善の方法は、再利用可能なサービスを作成することです。これにより、アプリケーション全体でそのメソッドを呼び出せるようになります。auth0.jsのWebAuth
オブジェクトのインスタンスは、サービスで作成できます。
- login :ユニバーサルログインを開始する
authorize
をauth0.jsから呼び出す - handleAuthentication :URLハッシュで認証結果を探し、auth0.jsの
parseHash
メソッドで処理する - setSession :ユーザーのアクセストークン、IDトークン、およびアクセストークンの有効期限を設定する
- logout :ブラウザーストレージからユーザーのトークンを削除する isAuthenticated:アクセストークンの有効期限が切れたかどうかを確認する
認証結果の処理
ユーザーがユニバーサルログイン経由で認証し、アプリケーションにリダイレクトで戻されると、認証情報はURLのハッシュフラグメントに含まれます。AuthService
のhandleAuthentication
メソッドが、ハッシュの処理を行います。
アプリのルートコンポーネントでhandleAuthentication
を呼び出すことで、ユーザーがアプリにリダイレクトで戻された後、アプリを最初に読み込む際、認証のハッシュフラグメントを処理できるようにします。
コールバックコンポーネントの追加
ユニバーサルログインを使用すると、ユーザーはアプリケーションからAuth0がホストするページに移動します。そして、正常に認証された後、クライアント側セッションがセットアップされた状態のアプリケーションに戻ります。 ユーザーを戻す場所はアプリケーション内の任意のURLに設定できますが、認証に成功したユーザーが戻る中心的な場所として専用のコールバックルートを作成することを推奨します。コールバックルートを単一にする利点は主に2つあります。- 複数の(時として未知の)コールバックURLを許可リストに登録する必要がなくなる
- アプリケーションがクライアント側セッションを設定する間、読み込み中のインジケーターを表示する場所になる
CallbackComponent
というコンポーネントを作成して、読み込み中インジケーターを自動入力します。
assets
ディレクトリで何らかの読み込み中スピナーを使えることが想定されています。デモはダウンロード可能なサンプルをご覧ください。
認証後、ユーザーは短時間だけ、読み込み中インジケーターが表示された/callback
ルートに移動します。この間にクライアント側セッションが設定され、完了したら/home
ルートにリダイレクトされます。
3.ユーザープロファイルの取得
トークンから情報を抽出する
このセクションでは、アクセストークンと/userinfoエンドポイントを使って、ユーザー情報を取得する方法について説明します。ライブラリーを使って、単にIDトークンをデコードすることもできます(必ず先に検証をしてください)。結果は同じです。他のユーザー情報が追加で必要な場合は、Management APIの使用を検討してください。
AuthService
クラスを更新します。ユーザーのアクセストークンをローカルストレージから抽出するgetProfile
関数を追加し、それをuserInfo
関数に渡してユーザー情報を取得します。
4.スコープに基づいた条件付きUI要素の表示
認可プロセスで、ユーザーに付与された実際のスコープをすでにローカルストレージに保存しています。authResult
で返されるscope
が空でない場合、ユーザーには最初に要求されたものと異なる一連のスコープが発行されたことを意味するので、authResult.scope
を使ってユーザーに付与されたスコープを判断する必要があります。
authResult
で返されるscope
が空の場合は、要求されたすべてのスコープがユーザーに付与されたことを意味するので、要求されたスコープを使用してユーザーに付与されたスコープを判断することができます。
この確認を行うために先ほど書いたsetSession
関数のコードがこちらです。
AuthService
クラスに追加する必要があります。
approve:timesheets
スコープを持つユーザーにのみ [Approve Timesheets(タイムシートの承認)] リンクを表示したい場合を考えます。下のコードでは、リンクを表示すべきか否かを判断するためにuserHasScopes
関数の呼び出しを追加します。
ルートの保護
ユーザーに正しいスコープが付与されていない場合にユーザーがルートにナビゲートされないよう、ルートを保護する必要もあります。このために、新しいScopeGuardService
サービスクラスを追加することができます。
approval
ルートの定義では、新しいScopeGuardService
が使用されています。
5.APIの呼び出し
angular2-jwtモジュールは、APIに対する要求にを自動的にアタッチするために使用できます。これは、AngularのHttp
クラスのラッパーであるAuthHttp
クラスを提供することで実現されます。
angular2-jwt
をインストールします。
angular2-jwt
の構成値を含むファクトリ関数を作成して、アプリケーションの@NgModule
でproviders
配列に追加します。ファクトリ関数には、ローカルストレージからaccess_token
を取得するtokenGetter
関数が必要です。
angular2-jwt
が構成されたら、AuthHttp
クラスを使用してアプリケーションの任意の場所からAPIを安全に呼び出すことができます。そのためには、AuthHttp
を必要な任意のコンポーネントまたはサービスに注入し、Angularの標準Http
クラスと同様に使用します。
6.アクセストークンの更新
ユーザーのアクセストークンの更新には、Angular SPAのアップデートが必要です。auth0.jsからcheckSession
メソッドを呼び出すメソッドをAuthService
に追加します。更新できたら、既存のsetSession
メソッドを使用してローカルストレージに新しいトークンを設定します。
AuthService
クラスにscheduleRenewal
というメソッドを追加して、認証をサイレント更新すべき時間をセットアップします。以下の例では、実際のトークンが期限切れになる30秒前に更新されるようにセットアップしています。また、Observableからサブスクリプションを解除するunscheduleRenewal
というメソッドも追加します。
AppComponent
内のscheduleRenewal
を呼び出します。これは、ユーザーの明示的なログインかサイレント認証のいずれかの認証フロー後に毎回発生します。