1 API エンドポイントを定義する
1 API エンドポイントを定義する
この実装では、Express Web アプリケーションフレームワーク を使用して Node.js API を構築します。
package.json ファイルを作成する
API 用のフォルダーを作成し、そのディレクトリに移動してnpm init を実行します。これにより、package.json ファイルが作成されます。デフォルト設定のままでも、必要に応じて変更してもかまいません。サンプルの package.json は次のとおりです。依存関係をインストールする
次に、以下のモジュールを依存関係として設定します。- express: このモジュールは、Express Web アプリケーションフレームワークを追加します。
- cors: このモジュールは、CORS を有効にするためのサポートを追加します。これは、Web ブラウザー内の別のドメインで実行されるシングルページアプリケーションから API が呼び出されるため、必要です。
- jwks-rsa: このライブラリは、JWKS (JSON Web Key Set) エンドポイントから RSA 署名鍵を取得します。
expressJwtSecretを使用すると、JWT ヘッダー内のkidに基づいて適切な署名鍵をexpress-jwtに提供するシークレットプロバイダーを生成できます。詳しくは、node-jwks-rsa GitHub リポジトリを参照してください。 - express-jwt: このモジュールは、Node.js アプリケーションで JWT トークンを使用して HTTP リクエストを認証します。JWT を簡単に扱うための複数の関数を提供します。詳しくは、express-jwt GitHub リポジトリを参照してください。
- body-parser: これは Node.js のボディ解析ミドルウェアです。受信リクエストストリームの本文全体を抽出し、扱いやすい形で
req.bodyとして利用できるようにします。
エンドポイントを実装する
API ディレクトリに移動し、server.js ファイルを作成します。コードでは次のことを行います。- 依存関係を追加する。
- エンドポイントを実装する。
- API サーバーを起動する。
node server を使用して API サーバーを起動し、localhost:8080/timesheets に HTTP POST リクエストを送信します。This is the POST /timesheets endpoint というメッセージを含む JSON レスポンスが表示されるはずです。これでエンドポイントはできましたが、現時点では誰でも呼び出せます。これをどのように修正できるかを確認するには、次の手順に進んでください。2 API エンドポイントを保護する
2 API エンドポイントを保護する
トークンを検証するには、express-jwt middleware が提供する
jwt 関数と、シークレットの取得に使用する jwks-rsa を利用します。これらのライブラリは次の処理を実行します。express-jwtはトークンをデコードし、リクエスト、ヘッダー、ペイロードをjwksRsa.expressJwtSecretに渡します。jwks-rsaは JWKS エンドポイントからすべての署名鍵をダウンロードし、その中に JWT ヘッダー内のkidと一致するものがあるかを確認します。受信したkidと一致する署名鍵がない場合は、エラーがスローされます。一致するものが見つかった場合は、適切な署名鍵をexpress-jwtに渡します。express-jwtは引き続き独自のロジックで、トークンの署名、有効期限、audience、issuerを検証します。
- アクセストークンを検証するミドルウェア関数を作成します。
- ルートでこのミドルウェアを有効にします。
localhost:8080/timesheets に HTTP POST を送信すると、エラーメッセージ Missing or invalid token が返されるはずです (リクエストでアクセストークンを送信していないため、これは正しい動作です) 。正常に動作するケースもテストするには、次の作業が必要です。- アクセストークンを取得します。取得方法の詳細については、Get an Access Token を参照してください。
- リクエストに
Authorizationヘッダーを追加し、その値をBearer ACCESS_TOKENに設定して API を呼び出します (ACCESS_TOKENには、最初の手順で取得したトークンの値を指定します) 。
3 アプリの権限を確認する
3 アプリの権限を確認する
このステップでは、アプリケーションに必要な権限 (またはスコープ) があるかどうかを確認し、エンドポイントを使ってタイムシートを作成できるようにします。特に、トークンに正しいスコープである 次に、特定のエンドポイントを呼び出す際に、JWT に特定のスコープが含まれていることを確認するため、ミドルウェアに このスコープを含まないトークンで API を呼び出すと、HTTP ステータスコード
batch:upload が含まれていることを確認します。これを行うには、express-jwt-authz Node.js パッケージを使用するので、これをプロジェクトに追加します。jwtAuthz(...) の呼び出しを追加します。追加の依存関係が必要です。express-jwt-authz ライブラリは express-jwt と組み合わせて使用され、JWT を検証するとともに、目的のエンドポイントを呼び出すために必要な適切な権限が含まれていることを確認します。詳細については、express-jwt-authz GitHub repository を参照してください。以下は実装例です (一部のコードは簡潔にするため省略しています) :403 のエラーメッセージ Forbidden が返されるはずです。これは、API からこのスコープを削除して確認できます。4 ユーザーの本人確認
4 ユーザーの本人確認
JWT の検証に使用する
express-jwt ミドルウェアでは、JWT に含まれる情報を req.user にも設定します。ユーザーを一意に識別するために sub クレームを使用する場合は、req.user.sub を利用できます。timesheets アプリケーションでは、一意の識別子としてユーザーのメールアドレスを使用します。Action を作成する
まず、ユーザーのメールアドレスをアクセストークンに追加する新しい Action を作成します。- Auth0 Dashboard > Actions > Library に移動し、Build Custom を選択します。
-
Action の説明的な Name (例:
Add email to access token) を入力し、Login / Post Login トリガーを選択して、Create を選択します。 -
Actions Code Editor を開き、次の JavaScript コードをコピーして貼り付け、Save Draft を選択して変更を保存します。
namespaceは、標準の OIDC クレームや内部サービスと競合しない一意のクレーム名にするために使用します。名前空間付きクレームおよび名前空間なしクレームの制限やガイドラインについて詳しくは、Create Custom Claims を参照してください。 - Actions Code Editor のサイドバーで Test (再生アイコン) を選択し、次に Run を選択してコードをテストします。
- Action を公開する準備ができたら、Deploy を選択します。
Action を Post-Login Trigger に追加する
次に、作成した Action を Post-Login Trigger に追加します。Actions を Trigger にアタッチする方法について詳しくは、Write Your First Action を参照してください。一意の識別子を取得する
最後に、API 内でreq.auth からクレームの値を取得します。その値を、タイムシートのエントリに関連付ける一意のユーザー識別子として使用します。