JWT オーソライザーを使用して HTTP API へのアクセスをコントロールする - Amazon API Gateway

JWT オーソライザーを使用して HTTP API へのアクセスをコントロールする

OpenID Connect (OIDC) および OAuth 2.0 フレームワークの一部として JSON ウェブトークン (JWT) を使用して、API へのクライアントアクセスを制限できます。

API のルートに JWT オーソライザーを設定する場合、API Gateway はクライアントが API リクエストとともに送信する JWT を検証します。API Gateway は、トークンの検証、およびオプションでトークン内のスコープに基づいてリクエストを許可または拒否します。ルートのスコープを設定する場合、ルートのスコープを 1 つ以上、トークンに含める必要があります。

API の各ルートに個別のオーソライザーを設定することも、複数のルートに同じオーソライザーを使用することもできます。

注記

JWT アクセストークンを OpenID Connect ID トークンなど他のタイプの JWT と区別する標準的なメカニズムはありません。API 認証に ID トークンが必要でない限り、認可スコープを要求するようにルートを設定することをお勧めします。また、JWT アクセストークンを発行するときにのみ ID プロバイダーが使用する発行者または対象者を要求するように JWT オーソライザーを設定することもできます。

API リクエストの承認

API Gateway は、次の一般的なワークフローを使用して、JWT オーソライザーを使用するように設定されたルートへの要求を承認します。

  1. identitySource でトークンを確認します。identitySource には、トークンのみを含めるか、Bearer のプレフィックスが付いたトークンのみを含めることができます。

  2. トークンをデコードします。

  3. 発行者の jwks_uri から取得したパブリックキーを使用して、トークンのアルゴリズムと署名を確認します。現在、RSA ベースのアルゴリズムのみがサポートされています。

  4. クレームを検証します。API Gateway は以下のトークンクレームを評価します。

    • kid –トークンには、トークンに署名した jwks_uri のキーと一致するヘッダークレームが必要です。

    • iss – オーソライザーに設定された issuer と一致する必要があります。

    • aud または client_id – オーソライザーに設定された audience エントリの 1 つと一致する必要があります。

    • exp – UTC の現在時刻より後にする必要があります。

    • nbf – UTC の現在時刻より前にする必要があります。

    • iat – UTC の現在時刻より前にする必要があります。

    • scope または scp – トークンには、ルートの authorizationScopes のスコープを少なくとも 1 つ含める必要があります。

これらのいずれかの手順が失敗した場合、API Gateway は API リクエストを拒否します。

API Gateway は JWT を検証した後、トークン内のクレームを API ルートの統合に渡します。Lambda 関数などのバックエンドリソースは、$context.authorizer.claims の JWT クレームにアクセスできます。たとえば、JWT に ID クレーム emailID が含まれている場合、そのクレームは $context.authorizer.claims.emailID で使用できます。

AWS CLI を使用した JWT オーソライザーの作成

JWT オーソライザーを作成する前に、クライアントアプリケーションを ID プロバイダーに登録する必要があります。また、HTTP API を作成しておく必要があります。HTTP API の作成例については、「HTTP API の作成」を参照してください。ID プロバイダーとして Amazon Cognito を使用する JWT オーソライザーで HTTP API を作成する AWS CloudFormation テンプレートの例については、「http-with-jwt-auth.yaml」を参照してください。

次のコマンドは、Amazon Cognito を ID プロバイダーとして使用する JWT オーソライザーを作成します。Audience では、Issuer に指定するユーザープールに関連付けられているクライアントの ID を指定します。

aws apigatewayv2 create-authorizer \ --name authorizer-name \ --api-id api-id \ --authorizer-type JWT \ --identity-source '$request.header.Authorization' \ --jwt-configuration Audience=audience,Issuer=https://cognito-idp.us-east-2.amazonaws.com/userPoolID

AWS CLI を使用して JWT オーソライザーを使用するようにルートを更新する

次のコマンドは、JWT オーソライザーを使用するようルートを更新します。

aws apigatewayv2 update-route \ --api-id api-id \ --route-id route-id \ --authorization-type JWT \ --authorizer-id authorizer-id \ --authorization-scopes user.id user.email