ステップ 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 repository を参照してください。 - express-jwt: このモジュールを使うと、Node.js アプリケーションで JWT トークンを使用して HTTP リクエストを認証できます。JWT を扱いやすくするための関数もいくつか用意されています。詳しくは、express-jwt GitHub repository を参照してください。
- body-parser: これは Node.js のリクエストボディを解析するミドルウェアです。受信した request ストリームからボディ全体を取り出し、
req.bodyとして扱いやすい形で利用できるようにします。詳しい情報や代替手段については、body-parser GitHub repository を参照してください。
エンドポイントを実装する
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 からこのスコープを削除してみてください。
以上です。これで完了です!