簡潔にするため、この実装では認証と認可のみに絞ります。サンプルで示すとおり、入力するタイムシートエントリはハードコードされており、API でそのタイムシートエントリが永続化されることはありません。代わりに、その情報の一部をそのまま返すだけです。
API エンドポイントを定義する
API エンドポイントとは
API エンドポイントは、オブジェクトを表す一意の URL です。このオブジェクトとやり取りするには、アプリケーションからその URL を指定する必要があります。たとえば、注文または顧客を返す API がある場合は、
/orders と /customers という 2 つのエンドポイントを設定できます。アプリケーションは異なる HTTP メソッドを使用してこれらのエンドポイントとやり取りします。たとえば、POST /orders で新しい注文を作成し、GET /orders で 1 件以上の注文データを取得できます。/timesheets エンドポイントへの HTTP GET リクエストにより、ユーザーは自分のタイムシートを取得できます。また、/timesheets エンドポイントへの HTTP POST リクエストにより、ユーザーは新しいタイムシートを追加できます。
実装は Node.js で確認してください。
エンドポイントを保護する
Missing or invalid token エラーメッセージを返して、リクエストを拒否する必要があります。
API が実行すべき検証は次のとおりです。
- の形式が正しいことを確認する
- 署名を確認する
- 標準クレームを検証する
JWT.io では、JWT の解析、署名の検証、クレームの検証など、この作業の大半を実行できるライブラリの一覧を提供しています。
アプリケーションの権限を確認する
ユーザーの識別方法
sub クレームがあります。Implicit Grant フローでは、このクレームにユーザーの識別情報が含まれます。これは Auth0 ユーザーの一意の識別子です。これを使うと、外部システム内の任意の情報を特定のユーザーに関連付けることができます。
また、カスタムクレームを使用して、ユーザーの別の属性 (メールアドレスなど) をアクセストークンに追加し、それを使ってユーザーを一意に識別することもできます。
実装については Node.js を参照してください。
SPA を実装する
- clientID: Auth0 の の値です。Dashboard の Application の Settings から取得できます。
- domain: Auth0 のドメインの値です。Dashboard の Application の Settings から取得できます。
- responseType: 使用する認証フローを指定します。Implicit Flow を使用する SPA の場合は、
token id_tokenに設定する必要があります。tokenの部分は、フローが URL フラグメントでアクセストークンを返すようにし、id_tokenの部分は、フローが も返すようにします。 - : API Identifier の値です。Dashboard の API の Settings から取得できます。
- redirectUri: ユーザーの認証後に Auth0 がリダイレクトする先の URL です。
- scope: IDトークン とアクセストークンで返される情報を決定する スコープ です。
openid profileスコープを指定すると、IDトークン にすべてのユーザープロファイル情報が返されます。また、API を呼び出すために必要なスコープ (この場合はread:timesheets create:timesheets) もリクエストする必要があります。これにより、アクセストークンにこれらのスコープが含まれることが保証されます。
authorize() メソッドを呼び出します。
parseHash() メソッドを呼び出す必要があります。
parseHash が返す authResult オブジェクトの内容は、使用した認証パラメーターによって異なります。次の項目が含まれる場合があります。
- idToken: ユーザープロファイル情報を含む IDトークン JWT
- accessToken: 対象者 で指定した API のアクセストークン。
- expiresIn: アクセストークンの有効期限 (秒単位) を表す文字列。
ユーザープロファイルを取得する
トークンから情報を取得する
このセクションでは、アクセストークンと /userinfo エンドポイント を使用してユーザー情報を取得する方法を説明します。この API 呼び出しを避けるには、代わりに IDトークン を ライブラリを使用して デコードすることもできます (先に必ず検証してください) 。追加のユーザー情報が必要な場合は、バックエンドから Management API を使用することを検討してください。
client.userInfo メソッドは、返された authResult.accessToken を渡して呼び出すことで、ユーザーのプロファイル情報を取得できます。これにより /userinfo エンドポイント にリクエストが送信され、ユーザー情報を含む user オブジェクトが返されます。以下の例のような内容です。
userInfo 関数の呼び出し時に渡されるコールバック関数では、これらのプロパティのいずれにもアクセスできます。
スコープに基づいて UI 要素を条件付きで表示する
scopeに応じて、特定の UI 要素を表示または非表示にできます。ユーザーに発行されたスコープを確認するには、認可プロセスで最初にリクエストしたスコープを保存しておく必要があります。ユーザーが認可されると、scopeはauthResultでも返されます。
authResult内のscopeが空の場合は、リクエストしたすべてのスコープが付与されたことを意味します。authResult内のscopeが空でない場合は、付与されたスコープのセットが異なることを意味するため、authResult.scopeに含まれる値を使用してください。
実装例については Angular 2 を参照してください。
API を呼び出す
Bearer スキームを使用して Authorization ヘッダーにアクセストークンを設定します。
実装例については Angular 2 を参照してください。
アクセストークンを更新する
7200 秒 (2 時間) ですが、API ごとに設定できます。
有効期限が切れると、アクセストークンは API へのアクセスに使用できなくなります。再度アクセスするには、新しいアクセストークンを取得する必要があります。
新しいアクセストークンを取得するには、最初のアクセストークンを取得したときと同じ認証フローをもう一度実行します。ただし SPA では、認証フローを再度完了するためにユーザーを現在の作業からリダイレクトしたくない場合があるため、これは理想的ではありません。
このような場合は、サイレント認証 を利用できます。サイレント認証では、Auth0 はリダイレクトのみを返し、ログインページは表示しない認証フローを実行できます。ただし、この方法を使用するには、ユーザーが事前に シングルサインオン (SSO) でログインしている必要があります。
実装例は Angular 2 を参照してください。