1 APIエンドポイントを定義する
1 APIエンドポイントを定義する
この実装ではExpress Webアプリケーションフレームワークを使用してNode.js APIを構築します。
package.jsonファイルを作成する
API用のフォルダを作成し、そこに移動してnpm init
を実行します。これにより、package.json
ファイルがセットアップされます。デフォルト設定のままにするか、必要に応じて変更します。サンプルのpackage.json
は次のようになります。依存関係をインストールします
次に、以下のモジュールで依存関係を設定します。- express :このモジュールはExpress Webアプリケーションフレームワークを追加します。
- cors :このモジュールはCORSを有効にするためのサポートを追加します。これは、APIがWebブラウザー内の別のドメインで実行されるシングルページアプリケーションから呼び出されるために必要です。
- jwks-rsa :このライブラリーは、JWKS(JSON Web Key Set)エンドポイントからRSA署名鍵を取得します。
expressJwtSecret
を使用すると、JWTヘッダーのkid
に基づいてexpress-jwt
に正しい署名鍵を提供するシークレットプロバイダーを生成することができます。詳細については、「node-jwks-rsa GitHubリポジトリ」を参照してください。 - express-jwt :このモジュールは、Node.jsアプリケーションでJWTトークンを使用してHTTP要求を認証します。JWTを使用した作業を容易にする、いくつかの機能が提供されています。詳細については、「express-jwt GitHubリポジトリ」を参照してください。
- 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ミドルウェアが提供するここでサーバーを起動して
jwt
関数とjwks-rsa
を使用してシークレットを取得します。ライブラリーは以下を行います。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 アプリの権限を確認する
3 アプリの権限を確認する
このステップでは、アプリケーションに権限(またはスコープ)があるかを確認する機能を追加して、タイムシートを作成するためにエンドポイントを使用します。特に、トークンのスコープが正しくここでこのスコープを含まないトークンを使用してAPIを呼び出すと、HTTPステータスコード
batch:upload
であることを確認することが目的です。そのためには、express-jwt-authz
Node.jsパッケージを利用するので、それをプロジェクトに追加します。jwtAuthz (...)
への呼び出しをミドルウェアに追加して、特定のエンドポイントを実行するために、特定のスコープがJWTに含まれていることを確認します。依存関係を追加します。express-jwt-authz ライブラリーはexpress-jwtと組み合わせて使用され、JWTを検証し、目的のエンドポイントを呼び出すための正しい権限を持っていることを保証します。詳細については、「express-jwt-authz GitHubリポジトリ」を参照してください。以下はサンプル実装を示します(簡潔にするために一部のコードは省略しています)。403
の「Forbidden(禁止)」というエラーメッセージが表示されます。APIからこのスコープを削除と、これをテストすることができます。4 ユーザーIDを決定する
4 ユーザーIDを決定する
JWTの検証に使われる
express-jwt
ミドルウェアは、JWTに含まれる情報をreq.user
に設定します。sub
クレームを使用してユーザーを一意に識別したい場合は、req.user.sub
を使用できます。タイムシートアプリケーションでは、ユーザーのメールアドレスを一意の識別子として使用することが目的です。アクションを作成する
まず、アクセストークンにユーザーのメールアドレスを追加するアクションを新規作成します。- [Auth0 Dashboard] > [Actions(アクション)] > [Library(ライブラリー)]に移動し、[Build Custom(カスタム作成)] を選択します。
-
アクションの説明的な [Name(名前)] を入力し(たとえば、
Add email to access token
)、[Login / Post-Login(ログイン/ログイン後)] トリガー、[Create(作成)] の順に選択します。 -
Actionsコードエディターを見つけて、次のJavaScriptコードをコピーし、[Save Draft(下書きを保存)] を選択して変更を保存します。
namespace
(名前空間)を使うと、クレームの名前が標準のOIDCクレームや内部サービスと衝突しない、一意のものになります。名前空間のあるクレームと名前空間のないクレームの制約やガイドラインについては、「カスタムクレームを作成する」をお読みください。 - Actionsコードエディタのサイドバーから[Test(テスト)](再生アイコン)を選択し、[Run(実行)] を選択してコードをテストします。
- アクションを公開する準備ができたら、[Deploy(デプロイ)] を選択します。
ログインフローにアクションを追加する
次に、作成したアクションをログインフローに追加します。フローにアクションをアタッチする方法の詳細については、「初めてのアクションを作成する」の「アクションをフローにアタッチする」セクションをお読みください。一意の識別子を取得する
最後に、APIの内部から、req.auth
からクレームの値を取得します。その値を、タイムシートエントリーに関連付ける一意のユーザー識別子として使用します。