1 APIエンドポイントを定義する
1 APIエンドポイントを定義する
この実装では、Node.js API の構築に Express Webアプリケーションフレームワーク を使用します。
package.json ファイルを作成する
API 用のフォルダーを作成し、そのフォルダーに移動してnpm init を実行します。これにより、package.json ファイルが作成されます。デフォルト設定のままでも、必要に応じて変更してもかまいません。このサンプルの package.json は次のようになります。依存関係をインストールする
次に、以下のモジュールを使って依存関係を設定します。- express: このモジュールは Express web application framework を追加します。
- cors: このモジュールは、CORS を有効にするためのサポートを追加します。API は、Web ブラウザー内の別ドメインで動作するシングルページアプリケーションから呼び出されるため、これが必要です。
- jwks-rsa: このライブラリは、JWKS (JSON Web Key Set) endpoint から RSA 署名鍵を取得します。
expressJwtSecretを使用すると、JWT ヘッダー内のkidに基づいて、express-jwtに適切な署名鍵を提供するシークレットプロバイダーを生成できます。詳しくは、node-jwks-rsa GitHub repository を参照してください。 - express-jwt: このモジュールは、Node.js アプリケーションで JWT トークンを使って HTTP リクエストを認証します。JWT をより簡単に扱えるようにするための複数の関数を提供します。詳しくは、express-jwt GitHub repository を参照してください。
- 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と一致するものがあるかを確認します。一致する署名鍵がなければエラーがスローされます。一致するものがあれば、正しい署名鍵を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(...) の呼び出しを追加します。依存関係をもう 1 つ追加します。express-jwt-authz ライブラリは express-jwt と組み合わせて使用され、JWT を検証するとともに、目的のエンドポイントを呼び出すための適切な権限が含まれていることを確認します。詳しくは、express-jwt-authz GitHub repository を参照してください。以下がサンプル実装です (簡潔にするため、一部のコードは省略しています) :403 とともに、Forbidden というエラーメッセージが返されるはずです。これは、API からこのスコープを削除して確認できます。4 ユーザーの本人確認
4 ユーザーの本人確認
JWT の検証に使用される
express-jwt ミドルウェアでは、JWT に含まれる情報を使って req.user も設定されます。ユーザーを一意に識別するために sub claim を使いたい場合は、req.user.sub を使用できます。timesheets アプリケーションでは、一意の識別子としてユーザーのメールアドレスを使用します。Action を作成する
まず、ユーザーのメールアドレスを access token に追加する新しい 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は、claim 名が標準の OIDC claim や内部サービスと競合しないよう、一意にするために使用されます。名前空間付きおよび名前空間なしの claim に関する制限やガイドラインについて詳しくは、Create Custom Claims を参照してください。 - Actions Code Editor のサイドバーで Test (再生アイコン) を選択し、Run を選択してコードをテストします。
- Action を公開する準備ができたら、Deploy を選択します。
Action を Post-Login Trigger に追加する
次に、作成した Action を Post-Login Trigger に追加します。Action を Trigger に関連付ける方法については、Write Your First Action を参照してください。一意の識別子を取得する
最後に、API 内でreq.auth から claim の値を取得します。その値を、timesheet エントリに関連付ける一意のユーザー識別子として使用します。