1.APIエンドポイントを定義する
Express Webアプリケーションフレームワークを使用してNode.js APIを構築します。package.jsonファイルを作成する
API用のフォルダーを作成しそこに移動して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リポジトリ」を参照してください。
エンドポイントを実装する
APIディレクトリに移動し、server.jsファイルを作成します。コードに必要なこと:
- 依存関係を設定する。
- 要求本文解析ミドルウェアを有効にする。
- エンドポイントを実装する。
- APIサーバーを起動する。
node serverを使用してAPIサーバーを起動し、localhost:8080/timesheets/uploadにHTTP POST要求を行います。「This is the POST /timesheets/upload endpoint」というメッセージを含むJSON応答が表示されます。
これでエンドポイントが入手できましたが、それは誰でも呼び出すことができます。次の段落に進んで、この問題を解決する方法を確認します。
2. APIエンドポイントをセキュリティ保護する
トークンを検証するには、express-jwtミドルウェアが提供するjwt関数とjwks-rsaパッケージを使用してAuth0から公開鍵を取得します。ライブラリーは以下を行います。
express-jwtはトークンをデコードし、要求、ヘッダー、ペイロードをjwksRsa.expressJwtSecretに渡します。- その後
jwks-rsaはJWKSエンドポイントからすべての署名鍵をダウンロードし、署名鍵の1つがJWTヘッダーのkidと一致するかどうかを確認します。どの署名鍵も受け取ったkidに一致しない場合、エラーがスローされます。一致するものがあれば、express-jwtに正しい署名鍵を渡します。 express-jwtはトークンの署名、有効期限、audience、issuerを検証する独自のロジックを継続します。
- アクセストークンを検証するミドルウェア関数を作成する。
- ルートでミドルウェアを使用できるようにする。
localhost:8080/timesheetsにHTTP POSTを実行すると、エラーメッセージMissing or invalid tokenが表示されるはずです(要求でアクセストークンを送信しなかったためこれは正確です)。
また、作業シナリオをテストするためには、次を実行する必要があります。
- アクセストークンを取得する。詳しい取得方法については、以下をご覧ください:アクセストークンを取得する
- APIを呼び出し、値
Bearer ACCESS_TOKENを指定してAuthorizationヘッダーを要求に追加します(ACCESS_TOKENは最初の手順で取得したトークンの値)。
3. クライアントの権限を確認する
この手順では、クライアントに権限(またはスコープ)があるかを確認する機能を実装に追加して、タイムシートをアップロードするためにエンドポイントを使用します。特にトークンのスコープが正しく、batch:uploadであることを確認することが目的です。
そのためには、express-jwt-authz Node.jsパッケージを利用するので、それをプロジェクトに追加します。
jwtAuthz (...)への呼び出しをミドルウェアに追加して、特定のエンドポイントを実行するために、特定のスコープがJWTに含まれていることを確認します。以下はサンプル実装を示します(簡潔にするために一部のコードは省略しています)。
403の「Forbidden(禁止)」というエラーメッセージが表示されます。APIからこのスコープを削除すると、これをテストすることができます。
これで作業完了です!完了です。