ステップ 1. API エンドポイントを定義する
package.json ファイルを作成する
npm init を実行します。これにより、package.json ファイルが作成されます。
デフォルト設定のままでも、必要に応じて変更してもかまいません。
サンプルの package.json は次のとおりです。
依存関係をインストールする
- express: Express Web アプリケーションフレームワークを追加するモジュールです。
- jwks-rsa: JWKS (JSON Web Key Set) エンドポイントから RSA 署名鍵を取得するライブラリです。
expressJwtSecretを使用すると、 ヘッダー内のkidに基づいて、express-jwtに適切な署名鍵を提供するシークレットプロバイダーを生成できます。詳細については、node-jwks-rsa GitHub リポジトリを参照してください。 - express-jwt: Node.js アプリケーションで JWT を使用して HTTP リクエストを認証できるモジュールです。JWT をより簡単に扱うための複数の関数が用意されています。詳細については、express-jwt GitHub リポジトリを参照してください。
- body-parser: Node.js 用のボディ解析ミドルウェアです。受信リクエストストリームのボディ全体を抽出し、扱いやすい形で
req.bodyとして利用できるようにします。詳細およびいくつかの代替手段については、body-parser GitHub リポジトリを参照してください。
エンドポイントを実装する
server.js ファイルを作成します。コードでは、次のことを行う必要があります。
- 依存関係を設定します。
- リクエストボディを解析するミドルウェアを有効にします。
- エンドポイントを実装します。
- API サーバーを起動します。
node server で API サーバーを起動し、localhost:8080/timesheets/upload に HTTP POST リクエストを送信します。This is the POST /timesheets/upload endpoint というメッセージを含む JSON レスポンスが表示されるはずです。
これでエンドポイントは用意できましたが、このままでは誰でも呼び出せます。これを修正する方法については、次の段落に進んで確認してください。
ステップ 2. API エンドポイントを保護する
jwt 関数と、Auth0 から公開鍵を取得するための jwks-rsa パッケージを使用します。これらのライブラリは、次のように動作します。
express-jwtはトークンをデコードし、リクエスト、ヘッダー、ペイロードをjwksRsa.expressJwtSecretに渡します。jwks-rsaは JWKS エンドポイントからすべての署名鍵をダウンロードし、その中に JWT ヘッダーのkidと一致するものがあるかどうかを確認します。受信したkidに一致する署名鍵がない場合は、エラーがスローされます。一致するものがあれば、適切な署名鍵をexpress-jwtに渡します。express-jwtはその後、独自のロジックでトークンの署名、有効期限、audience、issuerを検証します。
- を検証するミドルウェア関数を作成します。
- ルートでそのミドルウェアを有効にします。
localhost:8080/timesheets/upload に HTTP POST リクエストを送信すると、Missing or invalid token というエラーメッセージが返されるはずです (リクエストでアクセストークンを送信していないため、これは想定どおりです) 。
正常に動作するケースもテストするには、次の手順を実行します。
- アクセストークンを取得します。取得方法の詳細については、Get an Access Token を参照してください
- リクエストに値
Bearer ACCESS_TOKENを指定したAuthorizationヘッダーを追加して API を呼び出します (ACCESS_TOKENは最初の手順で取得したトークンの値です) 。
ステップ 3. クライアントの権限を確認する
scope) をクライアントが持っているかどうかを確認する機能を実装に追加します。具体的には、トークンに適切なスコープ batch:upload が含まれていることを確認します。
これを行うには、express-jwt-authz Node.js パッケージを使用するため、プロジェクトに追加してください。
jwtAuthz(...) の呼び出しを追加するだけです。以下は実装例です (一部のコードは簡潔にするため省略しています) 。
403 とともに、Forbidden というエラーメッセージが返されるはずです。これを確認するには、API からこのスコープを削除してテストします。
以上で完了です。