Skip to main content
このドキュメントはMobile + API Architecture Scenarioの一部で、Node.jsでAPIを実装する方法を説明しています。Node.js API実装の完全なソースコードは、このGitHubリポジトリで確認できます。 実装されているソリューションの詳細については、シナリオを参照してください。
この実装では、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レスポンスが返されるはずです。これでエンドポイントはできましたが、現状では誰でも呼び出せてしまいます。これをどう改善するかは、次の手順に進んで確認してください。
トークンを検証するには、express-jwt middleware が提供する jwt 関数と、シークレットを取得するための jwks-rsa を使用します。これらのライブラリは次の処理を行います。
  1. express-jwt はトークンをデコードし、リクエスト、ヘッダー、ペイロードを jwksRsa.expressJwtSecret に渡します。
  2. jwks-rsa は JWKS エンドポイントからすべての署名鍵をダウンロードし、その中に JWT のヘッダー内の kid と一致するものがあるかを確認します。一致する署名鍵がなければエラーがスローされます。一致するものがあれば、正しい署名鍵を express-jwt に渡します。
  3. express-jwt は続いて、トークンの署名、有効期限、audience、および issuer を検証します。
コードで行う手順は次のとおりです。
  • アクセストークンを検証するミドルウェア関数を作成します。
  • ルートでそのミドルウェアを有効にします。
また、実際にタイムシートをデータベースに保存するコードを記述することもできます。以下はサンプル実装です (一部のコードは簡潔にするため省略しています) 。この時点でサーバーを起動し、localhost:8080/timesheets に HTTP POST を送信すると、Missing or invalid token というエラーメッセージが返されるはずです (リクエストでアクセストークンを送信していないため、これは正しい結果です) 。動作するケースもテストするには、次のことを行う必要があります。
  • アクセストークンを取得します。取得方法の詳細については、Get an Access Token を参照してください。
  • リクエストに Authorization ヘッダーを追加し、その値を Bearer ACCESS_TOKEN にして API を呼び出します (ACCESS_TOKEN には、最初の手順で取得したトークンの値を指定します) 。
このステップでは、アプリケーションに権限 (またはスコープ) があるかどうかを確認し、タイムシートを作成するためにエンドポイントを利用できるようにします。特に、トークンに正しいスコープ、つまり batch:upload が含まれていることを確認します。そのために、express-jwt-authz Node.js パッケージを使用するので、これをプロジェクトに追加してください。
次に、特定のエンドポイントを実行するには JWT に特定のスコープが含まれている必要があることを確認するため、ミドルウェアに jwtAuthz(...) の呼び出しを追加します。依存関係をもう 1 つ追加します。express-jwt-authz ライブラリは express-jwt と組み合わせて使用され、JWT を検証するとともに、目的のエンドポイントを呼び出すための適切な権限が含まれていることを確認します。詳しくは、express-jwt-authz GitHub repository を参照してください。以下がサンプル実装です (簡潔にするため、一部のコードは省略しています) :
このスコープを含まないトークンで API を呼び出すと、HTTP ステータスコード 403 とともに、Forbidden というエラーメッセージが返されるはずです。これは、API からこのスコープを削除して確認できます。
JWT の検証に使用される express-jwt ミドルウェアでは、JWT に含まれる情報を使って req.user も設定されます。ユーザーを一意に識別するために sub claim を使いたい場合は、req.user.sub を使用できます。timesheets アプリケーションでは、一意の識別子としてユーザーのメールアドレスを使用します。
Action を作成する
まず、ユーザーのメールアドレスを access token に追加する新しい Action を作成します。
  1. Auth0 Dashboard > Actions > Library に移動し、Build Custom を選択します。
  2. Action のわかりやすい Name を入力し (たとえば Add email to access token) 、Login / Post Login トリガーを選択して、Create を選択します。
  3. Actions Code Editor で、次の JavaScript コードをコピーして貼り付け、変更内容を保存するために Save Draft を選択します。
    namespace は、claim 名が標準の OIDC claim や内部サービスと競合しないよう、一意にするために使用されます。名前空間付きおよび名前空間なしの claim に関する制限やガイドラインについて詳しくは、Create Custom Claims を参照してください。
  4. Actions Code Editor のサイドバーで Test (再生アイコン) を選択し、Run を選択してコードをテストします。
  5. Action を公開する準備ができたら、Deploy を選択します。
Action を Post-Login Trigger に追加する
次に、作成した Action を Post-Login Trigger に追加します。Action を Trigger に関連付ける方法については、Write Your First Action を参照してください。
一意の識別子を取得する
最後に、API 内で req.auth から claim の値を取得します。その値を、timesheet エントリに関連付ける一意のユーザー識別子として使用します。