MFA 用のアクセストークンを検証する
- トークンの署名を検証する。これにより、トークンの送信者が名乗っている本人であることを確認し、送信中にメッセージが改ざんされていないことを確かめます。
- 標準クレームを検証する。
シナリオ: プッシュ通知を使用する銀行取引
view:balance) 、もう 1 つは資金の振替 (scope transfer:funds) です。アプリケーションが API にユーザーの残高の取得をリクエストする場合、アクセストークンには view:balance スコープが含まれている必要があります。別の口座に送金する場合、アクセストークンには transfer:funds スコープが含まれている必要があります。
ワークフロー
- ユーザーは、ユーザー名とパスワードによる認証を使ってアプリケーションにログインします。通常のログインでは、ユーザーは API とやり取りして残高を取得できます。つまり、ユーザーの認証後にアプリが受け取る アクセストークン には、
view:balanceスコープが含まれています。 - アプリケーションは、アクセストークン を credentials として使用し、残高を取得するための request を API に送信します。
- API は token を検証し、ユーザーが残高を確認できるよう、その情報をアプリケーションに返します。
- ユーザーは、ある口座から別の口座に資金を振り替えたいと考えています。これは高額な transaction と見なされるため、
transfer:fundsスコープが必要です。アプリケーションは、同じ アクセストークン を使用して request を API に送信します。 - API は token を検証しますが、token に必要な
transfer:fundsスコープが含まれていないため、アクセスを拒否します。 - アプリケーションは Auth0 にリダイレクトされます。ここでは Action を使用して、高権限のスコープが要求されたため、ユーザーに MFA による認証を求めます。ユーザーが MFA での認証に成功すると、正しいスコープを含む新しい アクセストークン が生成され、response の一部としてアプリケーションに送信されます。
- アプリケーションは、今度は
transfer:fundsスコープを含む新しい アクセストークン を使用して、再度資金振替の request を送信します。 - API は token を検証し、それを破棄して処理を続行します。
前提条件
- Single-Page Web App を登録する。
- データベース接続を作成する。
- API を登録する。
view:balanceとtransfer:fundsの 2 つのスコープを作成します。 - プッシュ通知を使用するには、MFA を有効にする。
Action を作成する
transfer:funds scope が要求されたときに、ユーザーに MFA 認証を求める Action を作成します。Auth0 Dashboard > Actions > Flows に移動し、次の内容を含む Action を作成します。
CLIENTS_WITH_MFA変数には、この Action を適用するアプリケーションの が含まれます。不要な場合は、これ (およびその後のif条件文) を削除できます。event.transaction.requested_scopesプロパティには、認証リクエストで要求されたすべてのスコープが含まれます。ここにtransfer:fundsが含まれている場合は、context.multifactorプロパティを適切な値に設定して MFA を要求します。この例では、push を使用して 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;
API を設定する
-
API に 2 つのエンドポイントを設定します。
GET /balance: 現在の残高を取得するPOST /transfer: 資金を送金する -
Node.jsといくつかのモジュールを使用します。- express: Express Web アプリケーションフレームワークを追加します。
- jwks-rsa: JWKS (JSON Web Key Set) endpoint から RSA 署名鍵を取得します。
expressJwtSecretを使用すると、JWT header のkidに基づいて適切な署名鍵をexpress-jwtに渡す secret provider を生成できます。 - express-jwt:
Node.jsアプリケーションで JWT token を使って HTTP request を認証できます。JWT を扱いやすくするさまざまな関数が用意されています。 - express-jwt-authz: アクセストークンに特定のスコープが含まれているかどうかを確認します。
-
dependencies をインストールします。
npm install express express-jwt jwks-rsa express-jwt-authz --save -
API endpoint を定義し、アクセストークンを検証するミドルウェア関数を作成して、そのミドルウェアで endpoint を保護します。
server.jsファイルのコードは、次のサンプルスクリプトのようになります。
- エンドポイントが
checkJwtミドルウェアを呼び出します。 2.express-jwtがトークンをデコードし、request、header、payload をjwksRsa.expressJwtSecretに渡します。 3.jwks-rsaが JWKS エンドポイントからすべての署名鍵をダウンロードし、その中にアクセストークンの header 内のkidと一致するものがあるかどうかを確認します。受信したkidに一致する署名鍵が1つもない場合は、エラーがスローされます。一致するものがあれば、適切な署名鍵をexpress-jwtに渡します。 4.express-jwtはその後の独自のロジックに従って、トークンの署名、有効期限、audience、issuer を検証します。 5.jwtAuthzは、エンドポイントが必要とする スコープ がアクセストークンに含まれているかどうかを確認します。指定された スコープ がアクセストークンに含まれていない場合、リクエストは 403 エラーで拒否されます。