メインコンテンツへスキップ
Auth0 が発行する を受け入れるカスタムオーソライザーを使用して、AWS API Gateway エンドポイントを保護します。これを行うには、API Gateway で API を設定し、API エンドポイントを保護するための AWS Lambda 関数 (カスタムオーソライザーを含む) を作成して設定したうえで、ユーザーが API へのアクセスに必要なアクセストークンを Auth0 から取得できるように を実装します。 詳細については、AWS API Gateway にログインした後、AWS Lambda Overview を参照してください。 API Gateway は、Lambda 関数の前段にサービスレイヤーを追加することで、Lambda の機能を拡張します。これにより、セキュリティの強化、入出力メッセージ変換の管理、スロットリングや監査などの機能を利用できます。サーバーレスアプローチを採用すると、スケールアウトやフォールトトレランスといった課題はコードを実行するコンピュートサービスが担うため、運用上の負担を軽減できます。 カスタムオーソライザーでは、次のことを行います。
  • API にアクセスするリクエストの authorization ヘッダーでアクセストークンが渡されていることを確認します。
  • JWKS エンドポイントから取得した公開鍵を使用して、アクセストークンの RS256 署名を検証します。
  • アクセストークンに必要な Issuer iss クレームと aud クレームが含まれていることを確認します。
カスタムオーソライザーを使用するには、次の手順に従います。
  1. Auth0 API を作成する
  2. AWS API Gateway API をインポートしてデプロイする
  3. カスタムオーソライザーを作成する
  4. カスタムオーソライザーを使用して API を保護する
  5. デプロイをテストする
の詳細については、Signing Algorithms を参照してください。JWKS の使用方法の詳細については、JSON Web Key Sets を参照してください。

API Gateway のカスタムオーソライザーの動作

Amazon によると、API Gateway のカスタムオーソライザーは「 などのベアラートークン認証戦略を使用して API へのアクセスを制御するために、ユーザーが用意する Lambda 関数」です。 ユーザーまたはプログラムが API を呼び出そうとするたびに、API Gateway はその API にカスタムオーソライザーが設定されているかどうかを確認します。 API にカスタムオーソライザーが設定されている場合、API Gateway はカスタムオーソライザーを呼び出し、受信したリクエストヘッダーから抽出した認可トークンを渡します。 カスタムオーソライザーを使用すると、JWT の検証を含むさまざまな認可戦略を実装し、リクエストを認可する IAM ポリシーを返すことができます。返されたポリシーが無効な場合、または権限が拒否された場合、API 呼び出しは失敗します。 有効なポリシーの場合、API は返されたポリシーをキャッシュし、受信したトークンに関連付けて、現在および以降のリクエストに使用します。ポリシーをキャッシュする時間は設定できます。デフォルト値は 300 秒で、キャッシュの最長時間は 3600 秒です (値を 0 に設定してキャッシュを無効にすることもできます) 。 詳細については、Amazon Developer’s Guide の What is Amazon API Gateway? を参照してください。 の検証について詳しくは、JSON Web Token の記事を参照してください。

前提条件

AWS アカウントにサインアップする必要があります。これにより、API Gateway や Lambda などの AWS の機能を利用できるようになります。新規ユーザーは、AWS の無料利用枠を 12 か月間利用できます。

Auth0 API を作成する

認可に成功したアプリケーションが利用する API を設定します。
  1. Auth0 Dashboard > Applications > APIs に移動し、Create API を選択します。
  2. 次のフィールドに値を入力し、Create を選択します。
    フィールド説明
    名前API の表示名です。この名前は Auth0 API の一覧に表示されます。
    識別子API の論理識別子です。この識別子は、https://your-api-gateway のような URL 形式にすることをお勧めします。
    署名アルゴリズム発行される アクセストークン の署名に Auth0 が使用するアルゴリズムです。詳細は、署名アルゴリズム を参照してください。
新しく作成した API の詳細を確認するには、Settings ビューを参照してください。
Dashboard - API の作成 - AWS API Gateway
API を作成すると、その API で使用する Machine to Machine Application も作成されます。このアプリケーションは、Machine to Machine Application ビューの Authorized に表示されます。を控えておいてください。このチュートリアルのパート 3 で必要になります。

AWS API Gateway API をインポートしてデプロイする

このチュートリアルのこの部分は、AWS の公式サンプルをもとにしています。詳しい注記や説明については、このサンプルを参照してください。
このステップでは、次の操作を行います。
  • API Gateway に API をインポートする
  • API のインポートをテストする
  • 任意のフロントエンドアプリケーションで使用できるように API をデプロイする
  • API のデプロイをテストする

Pets API をインポートして設定する

  1. AWS アカウントにログインし、上部のナビゲーションバーにある Services ドロップダウンから API Gateway Console に移動します。
  2. 以前に API を作成したことがある場合は、API Gateway Console に移動して Create API をクリックします。すると、Create new API フォームで Example API を作成するオプションが表示されます。 API Gateway を使用して API を一度も作成したことがない場合は、次の画面が表示されます。続行するには Get Started をクリックします。
    AWS API Gateway - Get Started
    API Gateway へようこそというポップアップメッセージが表示されます。続行するには OK をクリックします。
  3. Create new API フォームでは、既定で Example API が選択されており、エディターにはサンプル API が定義されています。このチュートリアルの以降の手順ではこの API を使用するため、Import をクリックして API の作成を開始します。
    AWS API Gateway - Example API
    完了すると、指定したデータを使用して API が作成され、設定されたことを示すメッセージが AWS によって表示されます。この API にはすでにメソッド (GETPOST) が関連付けられています。リソースツリーでメソッド名をクリックすると、メソッドの詳細を表示したり、設定を変更したり、メソッド呼び出しをテストしたりできます。
    AWS API Gateway - Resources Tree

API をテストする

API をテストするには、/pets の下にある POST をクリックします。すると Method Execution ウィンドウが開き、POST メソッドの構造と動作の概要が表示されます。
  • Method RequestMethod Response: フロントエンドとの API インターフェース
  • Integration RequestIntegration Response: バックエンドとの API インターフェース
この画面から API をテストできます。
  1. Test (ページ中央の Client スライバーに表示) をクリックします。/pets - POST - Method Test ページに移動します。ページの一番下までスクロールし、Request Body に次のスニペットを入力します。
    {"type": "dog", "price": 249.99}
    
    リクエスト本文には、データベースに追加するペットの属性とその価格を指定します。
    AWS API Gateway - Request Body
  2. 続行するには Test をクリックします。テスト結果がページの右側に表示されます。
    AWS API Gateway - Test Results

API をデプロイする

先ほど実行したテストは、API Gateway コンソールを使用したものでした。別のアプリケーションから API を使用するには、API をステージにデプロイする必要があります。
  1. Actions メニューから Deploy API を選択します。
  2. 次の値を入力し、Deploy をクリックします。
    パラメーター
    Deployment stage[New Stage] を選択します
    Stage nameステージの名前を入力します
    Stage descriptionステージの説明を入力します
    Deployment descriptionAPI デプロイメントの説明を入力します

デプロイをテストする

API のデプロイが正常に完了すると、Test Stage Editor にリダイレクトされます。この時点で、API が正しくデプロイされたかどうかをテストできます。
  1. Test Stage Editor ウィンドウの上部には、Invoke URL が表示された青いバナーがあります。これは、API の GET エンドポイントを呼び出すための URL です。リンクをクリックして、ブラウザーで GET / メソッドのリクエストを送信します。成功すると、次のレスポンスが返されます。
    AWS API Gateway - デプロイ テスト レスポンス
  2. Stages ページで、Test の下のツリーを展開します。/pets/{petId} の下にある GET をクリックします。
    AWS API Gateway - Pet ID を取得
  3. ウィンドウ上部の青いバナーに Invoke URL が表示されます。最後の部分である {petID} はパス変数を表します。この変数を 1 に置き換え、ブラウザーで新しい URL にアクセスします。次の JSON ペイロードを含む HTTP 200 レスポンスが返されます。
    {
      "id": 1,
      "type": "dog",
      "price": 249.99
    }
    

カスタムオーソライザーを作成する

API Gateway で管理される完全に機能する API が用意できたので、この API を保護し、適切な認可を持つユーザーだけが API の背後にあるバックエンドにアクセスできるようにします。 API Gateway のカスタムリクエストオーソライザーを使用すると、OAuth 2.0 や SAML などのベアラートークン認可戦略を使って API へのアクセスを認可できます。受信した各リクエストに対して、次の処理が行われます。
  1. API Gateway は、適切に設定されたカスタムオーソライザーがあることを確認します。
  2. API Gateway は、認可トークンを渡してカスタムオーソライザー (Lambda 関数) を呼び出します。
  3. 認可トークンが有効な場合、カスタムオーソライザーは適切な AWS Identity and Access Management (IAM) ポリシーを返します。
  4. API Gateway は、手順 3 で返されたポリシーを使用してリクエストを認可します。

カスタムオーソライザーを準備する

Auth0 が発行するトークンをサポートするカスタムオーソライザーのサンプルをダウンロードできます。ダウンロード後は、カスタムオーソライザーがご利用の環境で動作するようにファイルをカスタマイズする必要があります。
  1. 上記でダウンロードしたサンプルファイルを含むフォルダーを任意の場所に展開し、コマンドラインでそのフォルダーに移動します。
  2. サンプルフォルダー内で npm install を実行して、デプロイに必要な Node.js パッケージをインストールします。後の手順で AWS にアップロードするバンドルには、これらのファイルを含める必要があります。
  3. .env ファイルを使用してローカル環境を設定します。cp .env.sample .env を実行すると、.env.sample ファイルをコピーして .env にリネームできます。次のように変更してください。
    パラメーター
    TOKEN_ISSUERトークンの発行者です。Auth0 がトークンの発行者である場合は、https://{yourDomain}/ を使用します。末尾のスラッシュを必ず含めてください。
    JWKS_URIJWKS エンドポイントの URL です。Auth0 がトークンの発行者である場合は、https://{yourDomain}/.well-known/jwks.json を使用します。
    AUDIENCE上記の「Auth0 API を作成する」セクションで作成した API の 識別子 値です。
    例として、設定完了後の .env ファイルの内容は次のようになります。

カスタムオーソライザーをローカルでテストする

有効な JWT アクセストークンを取得します。取得方法はいくつかあり、どの方法を選ぶかは、アプリケーションの種類、信頼レベル、エンドユーザー全体の体験によって異なります。詳細については、Get Access Tokensを参照してください。
  1. Auth0 Dashboard > Applications > APIs に移動し、対象の API を選択して Test を選ぶと、その API 用のテストトークンを取得できます。
  2. トークンを含むローカルの event.json ファイルを作成します。サンプルファイルをコピーできます (cp event.json.sample event.json を実行) 。ACCESS_TOKEN を JWT トークンに、methodArn を API の GET メソッドに対応する適切な ARN 値に置き換えます。
methodArn を取得するには、次の手順に従います。
  1. API Gateway Console で PetStore API を開きます。
  2. 左側のナビゲーションで Resources を選択します。
  3. 中央の Resources パネルでリソースツリーを展開し、/pets の下にある GET を選択します。
  4. Method Request ボックスに ARN が表示されます。
  5. npm test を実行してテストします。
このテストでは、lambda-local パッケージを使用して、トークンを使ってカスタムオーソライザーをテストします。テストが成功すると、次のような出力が表示されます。
Message
------
{
    "principalId": "C8npTEMVnBrILsBTI91MOh6dfuZbPVAU@clients",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": "arn:aws:execute-api:us-east-1:1234567890:apiId/stage/method/resourcePath"
            }
        ]
    },
    "context": {
        "scope": "FULL_LIST_OF_SCOPES"
    }
}
Effect の値が Allow の場合、authorizer は API Gateway への呼び出しを許可していたことになります。 詳細については、NPM の Lambda-local を参照してください。

IAM ロールを作成する

IAM ロールには Lambda 関数を呼び出すために必要な権限があります。カスタムオーソライザーの設定を進める前に、API Gateway がアクセスリクエストを受信するたびにカスタムオーソライザーを呼び出せる IAM ロールを作成する必要があります。
  1. AWS にログインし、IAM Console に移動します。左側のナビゲーションで Roles を選択します。
  2. Create new role を選択します。
  3. AWS serviceAWS Lambda の行を選択し、Next: Permissions を選択します。
  4. Attach permissions policy 画面で AWSLambdaRole を選択します。必要に応じて、用意されているフィルターを使って選択肢の一覧を絞り込めます。Next: Tags を選択し、続いて Next: Review を選択して進みます。
  5. Review 画面で、Auth0Integration などの Role name を入力します。ほかのフィールドはそのままにします。Create role を選択します。
  6. AWS でロールが作成されると、IAM の Roles ページに戻ります。新しく作成したロールを選択します。
  7. 作成したロールの Summary ページで、Trust relationships ビューを選択します。
  8. Edit trust relationship を選択し、Policy Document フィールドに次の JSON スニペットを入力します。
    {
       "Version": "2012-10-17",
       "Statement": [
          {
             "Effect": "Allow",
             "Principal": {
                "Service": [
                   "apigateway.amazonaws.com",
                   "lambda.amazonaws.com"
                ]
             },
             "Action": "sts:AssumeRole"
          }
       ]
    }
    
  9. Update Trust Policy をクリックします。
  10. Summary ページに戻ります。後で使用するため、Role ARN の値をコピーしておきます。
    undefined

Lambda 関数を作成し、カスタムオーソライザーをデプロイする

環境に合わせてカスタムオーソライザーを設定し、正しく動作することを確認できたら、AWS にデプロイします。
  1. npm run bundle を実行し、AWS にアップロードするバンドルを作成します。これにより、AWS Lambda に必要なソース、設定、および Node モジュールを含む custom-authorizer.zip バンドルが生成されます。
  2. Lambda コンソールに移動し、Create function をクリックします。
  3. Select blueprint ページで、空の関数を作成するために Author from scratch をクリックします。Basic information で、以下のパラメーターに値を設定します。
    パラメーター
    NamejwtRsaCustomAuthorizer などの Lambda 関数名
    DescriptionLambda 関数の説明 (任意)
    RuntimeNode.js 10.x を選択
  4. Create Function をクリックして続行します。
  5. 関数の Configuration ページで、Function Code セクションまで下にスクロールします。
  6. Code entry typeUpload a .ZIP file を選択します。
  7. Upload をクリックし、先ほど作成した custom-authorizer.zip バンドルを選択します。
  8. 次に、以下の 3 つの Environment variables を作成します。この情報は .env ファイルの内容と同じです。
    パラメーター
    TOKEN_ISSUERトークンの発行者です。Auth0 がトークン発行者である場合は、https://{yourDomain}/ を使用します
    JWKS_URIJWKS エンドポイントの URL です。Auth0 がトークン発行者である場合は、https://{yourDomain}/.well-known/jwks.json を使用します
    AUDIENCE手順 1 で作成した API の 識別子 の値
  9. Execution role セクションで Use an existing role を選択し、Existing role で以前作成した IAM ロールを選択します。
  10. Basic settings で、Timeout30 秒に設定します。
  11. Save をクリックします。
  12. 作成した Lambda 関数をテストするには、右上の Test をクリックします。
  13. event.json ファイルの内容を Configure test event フォームにコピーします。デフォルトの “Hello World” イベントテンプレートを使用できます。
  14. Create をクリックします。
  15. テストを選択して Test をクリックし、実行します。テストが成功すると、“Execution result: succeeded” と表示されます。出力ウィンドウを展開すると、ローカルでのテスト成功後に受け取ったものと同様のメッセージが表示されます。
    undefined

API Gateway のカスタムオーソライザーを設定する

  1. API Gateway Console に戻り、先ほど作成した PetStore API を開きます。
  2. 左側のナビゲーションで Authorizers を開き、Create New Authorizer を選択します。次に、以下のパラメーターを設定して Create をクリックします。
    パラメーター
    名前jwt-rsa-custom-authorizer
    タイプLambda を選択
    Lambda リージョン先ほど作成した Lambda 関数のリージョンを使用
    Lambda 関数jwtRsaCustomAuthorizer
    Lambda 呼び出しロール上でコピーした IAM Role ARN
    Lambda イベントペイロードToken を選択
    トークンソースAuthorization
    トークン検証^Bearer [-0-9a-zA-z\.]*$
    TTL (秒) 3600
  3. AWS によるオーソライザーの作成が完了し、ページが更新されたら、Test をクリックして、前に使用した Auth0 トークン (Bearer ey...) を入力し、オーソライザーをテストします。 テストが成功すると、次のようなレスポンスが表示されます。
    undefined

カスタムオーソライザーを使用した API の保護

API のエンドポイントを保護する方法については、Amazon API Gateway デベロッパーガイドの記事「API Gateway Lambda オーソライザーを使用する」を参照してください。

カスタムオーソライザーを使用するように API Gateway リソースを設定する

  1. AWS にログインし、API Gateway Console に移動します。
    カスタムオーソライザーはメソッドごとに設定します。1 つのオーソライザーで複数のメソッドを保護する場合は、各メソッドに対して以下の手順を繰り返す必要があります。
  2. このチュートリアルの手順 2 で作成した PetStore API を開きます。中央ペインの Resource ツリーで、/pets リソースの GET メソッドを選択します。
    undefined
  3. Method Request を選択します。
  4. Settings で、Authorization の右側にある pencil アイコンをクリックし、手順 3 で作成したカスタムオーソライザー jwt-rsa-custom-authorizer を選択します。
  5. check mark アイコンをクリックして、選択内容を保存します。API Key Required フィールドが false に設定されていることを確認してください。

API をデプロイする

変更を公開するには、API をデプロイします。
  1. Actions メニューから Deploy API を選択します。
  2. 次の値を設定し、Deploy をクリックします。
    パラメーター
    Deployment stage[New Stage] を選択します
    Stage nameステージの名前を入力します
    Stage descriptionステージの説明を入力します
    Deployment descriptionAPI デプロイの説明を入力します
正常に完了すると、Test Stage Editor にリダイレクトされます。デプロイをテストする際に必要になるため、上部の青いバーに表示される Invoke URL を控えておいてください。

デプロイをテストする

デプロイをテストするには、前の手順でメモした Invoke URL に対して GET リクエストを実行します。このテストが失敗する場合は、JWT アクセストークンを正しく取得できていることを確認してください。 詳細については、アクセストークンを取得する を参照してください。