MFA 用アクセストークンを検証する
- トークンの署名を検証して、トークンの送信者が正当な送信元であること、およびメッセージが途中で改ざんされていないことを確認します。
- 標準クレームを検証します。
| クレーム | 説明 |
|---|---|
exp | トークンの有効期限 |
iss | トークンの発行者 |
aud | トークンの想定受信者 |
シナリオ: プッシュ通知による銀行取引
view:balance) または資金の振替 (スコープ transfer:funds) です。アプリケーションが API にユーザーの残高の取得を要求する場合、アクセストークンには view:balance スコープが含まれている必要があります。別の口座に送金するには、アクセストークンに transfer:funds スコープが含まれている必要があります。
ワークフロー
- ユーザーは username とパスワード認証を使用してアプリケーションにログインします。通常のログインでは、このユーザーは API を操作して残高を取得できます。つまり、ユーザーの認証後にアプリケーションが受け取るアクセストークンには
view:balanceスコープが含まれます。 - アプリケーションは、アクセストークンを認証情報として使用し、残高を取得するリクエストを API に送信します。
- API はトークンを検証し、ユーザーが残高を表示できるよう、残高情報をアプリケーションに返します。
- ユーザーは、ある口座から別の口座へ資金を送金しようとします。これは高額トランザクションと見なされ、
transfer:fundsスコープが必要です。アプリケーションは同じアクセストークンを使用して API にリクエストを送信します。 - API はトークンを検証し、必要な
transfer:fundsスコープがトークンに含まれていないため、アクセスを拒否します。 - アプリケーションは Auth0 にリダイレクトし、そこで Action を使用して、高額なスコープが要求されたためユーザーに MFA による認証を求めます。ユーザーが MFA での認証に成功すると、正しいスコープを含む新しいアクセストークンが生成され、レスポンスの一部としてアプリケーションに送信されます。
- アプリケーションは、今度は
transfer:fundsスコープを含む新しいアクセストークンを使用して、再度資金送金のリクエストを送信します。 - API はトークンを検証し、それを破棄して処理を続行します。
前提条件
- シングルページ Web アプリを登録する。
- データベース接続を作成する。
- API を登録する。
view:balanceとtransfer:fundsの 2 つのスコープを作成します。 - プッシュ通知を使用するには、MFA を有効にする。
Action を作成する
transfer:funds スコープが要求されたときに、ユーザーに MFA での認証を求める Action を作成します。Dashboard > Actions > Flows に移動し、次の内容を含む Action を作成します。
CLIENTS_WITH_MFA変数には、この Action を適用したいアプリケーションの が含まれます。不要な場合は、これ (および後続のif条件) を削除できます。event.transaction.requested_scopesプロパティには、認証リクエストで要求されたすべてのスコープが含まれます。これにtransfer:fundsが含まれている場合は、context.multifactorプロパティを適切な値に設定して MFA を要求します。この例では、プッシュ を使用した MFA を要求しています。
アプリを設定する
-
MFAあり:
export const codeExample1 =
https://{yourDomain}/authorize? audience=https://my-banking-api& scope=openid%20view:balance%20transfer:funds& response_type=id_token%20token& client_id={yourClientId}& redirect_uri={https://yourApp/callback}& nonce=NONCE& state=OPAQUE_VALUE;
-
MFAなし:
export const codeExample2 =
https://{yourDomain}/authorize? audience=https://my-banking-api& scope=openid%20view:balance& response_type=id_token%20token& client_id={yourClientId}& redirect_uri={https://yourApp/callback}& nonce=NONCE& state=OPAQUE_VALUE;
| パラメーター | 設定 |
|---|---|
audience | APIのIdentifierに設定します (API Settingsで確認できます) 。ここでは https://my-banking-api を設定しています。 |
response_type | レスポンスでIDトークンとアクセストークンの両方を取得するため、id_token token に設定します。 |
client_id | アプリケーションのクライアントIDに設定します (Application Settingsで確認できます) 。 |
redirect_uri | 認証後にAuth0がリダイレクトする、アプリケーション内のURLに設定します (Application Settingsで確認できます) 。 |
nonce | Auth0からのレスポンスに含まれる、安全な文字列値に設定します。これはトークンリプレイ攻撃の防止に使用され、response_type=id_token token では必須です。 |
state | アプリケーションへのリダイレクト時にAuth0が含める不透明な値に設定します。この値は、アプリケーションがCSRF攻撃を防ぐために使用する必要があります。 |
API を設定する
-
API に 2 つのエンドポイントを設定します。
GET /balance: 現在の残高を取得するPOST /transfer: 資金を送金する -
Node.jsといくつかのモジュールを使用します。- express: Express Web アプリケーションフレームワークを追加します。
- jwks-rsa: JWKS (JSON Web Key Set) エンドポイントから RSA 署名キーを取得します。
expressJwtSecretを使用すると、JWT ヘッダー内のkidに基づいて適切な署名キーをexpress-jwtに提供するシークレットプロバイダーを生成できます。 - express-jwt: Node.js アプリケーションで JWT を使用して HTTP リクエストを認証できます。JWT を扱いやすくするための複数の関数が用意されています。
- express-jwt-authz: アクセストークンに特定のスコープが含まれているかどうかを確認します。
-
依存関係をインストールします。
npm install express express-jwt jwks-rsa express-jwt-authz --save -
API エンドポイントを定義し、アクセストークンを検証するミドルウェア関数を作成して、そのミドルウェアでエンドポイントを保護します。
server.jsファイルのコードは、次のサンプルスクリプトのようになります。
- エンドポイントが
checkJwtミドルウェアを呼び出します。 2.express-jwtがトークンをデコードし、リクエスト、ヘッダー、ペイロードをjwksRsa.expressJwtSecretに渡します。 3.jwks-rsaが JWKS エンドポイントからすべての署名鍵をダウンロードし、それらのいずれかがアクセストークンのヘッダー内のkidと一致するかを確認します。一致する署名鍵がない場合はエラーがスローされます。一致するものがある場合は、適切な署名鍵をexpress-jwtに渡します。 4.express-jwtは続いて、独自のロジックに従ってトークンの署名、有効期限、オーディエンス、発行者を検証します。 5.jwtAuthzは、エンドポイントが必要とするスコープがアクセストークンに含まれているかどうかを確認します。指定されたスコープがアクセストークンに含まれていない場合、リクエストは 403 エラーで拒否されます。