> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Amazon API Gateway チュートリアルのステップ 5

# AWS API Gateway チュートリアル ステップ 5

<Warning>
  この機能はデリゲーションを使用します。デフォルトでは、2017 年 6 月 8 日時点でアドオンを使用していないテナントでは、デリゲーションは無効になっています。現在デリゲーションを必要とするアドオンを使用している既存のテナントは、この機能を引き続き利用できます。今後、デリゲーション機能が変更またはサービスから削除される場合は、現在利用中のお客様に事前に通知し、移行に向けた十分な期間が設けられます。さらに、デリゲーションはカスタムドメインの使用をサポートしていないため、それに依存する機能はカスタムドメインと併用すると完全には動作しない可能性がある点に注意してください。
</Warning>

<div id="step-5-use-identity-tokens-to-flow-identity">
  ## ステップ 5 - IDトークン を使用して ID 情報を連携する
</div>

この最後のステップでは、次のことを行います。

* <Tooltip tip="OpenID: アプリケーションがログイン情報を収集および保存することなく、ユーザーの身元を確認できるようにする認証のためのオープン標準です。" cta="用語集を表示" href="/ja/docs/glossary?term=OpenID">OpenID</Tooltip> <Tooltip tip="OpenID: アプリケーションがログイン情報を収集および保存することなく、ユーザーの身元を確認できるようにする認証のためのオープン標準です。" cta="用語集を表示" href="/ja/docs/glossary?term=JSON+Web+Token">JSON Web Token</Tooltip> (JWT) を渡して、サービスに ID 情報を連携します。
* トークンを検証します。
* ペットの購入者を割り当てるために、ユーザープロファイル情報を抽出します。

<div id="use-an-identity-token">
  ## IDトークンを使用する
</div>

Lambda 関数を使用して、ユーザーに関する情報を処理し、取得できます。たとえば、購入トランザクション中に、<Tooltip tip="IDトークン: リソースへのアクセスではなく、クライアント自体を対象とした認証情報です。" cta="用語集を表示" href="/ja/docs/glossary?term=identity+token">IDトークン</Tooltip> とともに返されたユーザープロファイルから username を取得したとします。一方で、ユーザー情報を、JSON Web Token (JWT) である IDトークン自体に埋め込むこともできます。

JWT を使用する利点は、次のとおりです。

1. JWT の真正性を検証できる。
2. 呼び出し元のユーザーが認証済みであることを確認できる (改ざんされている可能性のある平文のパラメーターに依存する代わりに) 。

さらに、認可に JWT を使用することもでき、その場合は Amazon API Gateway との IAM 統合は不要になります。ただし、認可に API Gateway を使用すると、Lambda 関数を呼び出す前に API 呼び出しを停止できる点に注意してください。

<div id="add-information-to-the-jwt">
  ### JWT に情報を追加する
</div>

JWT にユーザー情報を追加する方法はいくつかあります。次の例では、ユーザーのメールアドレスを JWT に追加していますが、同じ考え方を他のユーザー属性にも適用できます。

<div id="use-rules">
  #### Rules を使用する
</div>

ユーザーのメールアドレスをJWTに追加する方法の1つは、[Rule](/ja/docs/customize/rules) を使用することです。これは、認証するユーザーのJWTでこの値を常に利用できるようにしたい場合に適した方法です。

`login.js` では、このスコープが `auth.signin` に渡すパラメーターに指定されていることを確認できます。

```js lines theme={null}
$scope.login = function() {
    var params = {
        authParams: {
          scope: 'openid email'
        }
      };

    auth.signin(params, function(profile, token) {
      ...
    }
  }
```

JWT にはユーザーの完全なユーザープロファイルを含めることもできますが、通常はすべてのリクエストで JWT が渡されるため、本当に必要な情報だけを含めるようにしてください。

<div id="validate-the-jwt-token">
  ## JWT トークンを検証する
</div>

AWS Lambda コンソールでは、ブラウザーのコンソールで Node.js コードを入力する場合に使用できる Node モジュールが限られているため、ID トークンを処理するには追加のモジュールを含め、Lambda 関数をパッケージとしてアップロードする必要があります。

詳細については、[Creating Deployment Packages using Node.js](http://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html) および [Uploading Deployment Packages and Testing](http://docs.aws.amazon.com/lambda/latest/dg/walkthrough-s3-events-adminuser-create-test-function-upload-zip-test.html) を参照してください。

次のシードプロジェクトには、更新後の AWS Lambda 関数に必要なコードが含まれています。

```js wrap lines theme={null}
<%= include('../../../_includes/_package', { org: 'auth0', repo: 'auth0-aws', path: 'examples/api-gateway/lambda' }) %>
```

シードプロジェクトには、2 つのカスタム JavaScript ファイルがあります。

* `index.js`: メインのコードが含まれています。
* `auth0-variables`: 更新が必要なコードが含まれています。

カスタムファイルに加えて、標準の Node.js `package.json` ファイルもあります。

このコードは、JWT から情報を抽出して検証するための機能を追加します。デフォルトでは、Auth0 は JWT の署名に対称鍵を使用しますが、非対称鍵を使用することもできます (トークンをサードパーティで検証できるようにする必要がある場合は、非対称鍵を使用し、公開鍵のみを共有してください) 。

トークンの検証について詳しくは、[Auth0 がサポートする ID プロトコル](/ja/docs/authenticate/protocols)を参照してください。

`auth0-variables.js` をシークレットキーで更新してください。このキーは、<Tooltip tip="Auth0 Dashboard: サービスを構成するための Auth0 の主要製品です。" cta="用語集を表示" href="/ja/docs/glossary?term=Auth0+Dashboard">Auth0 Dashboard</Tooltip> の Application の Settings タブにあります。

```javascript lines theme={null}
var env={};
env.AUTH0_SECRET='{yourAuth0Secret}';
module.exports = env;
```

ファイルがあるディレクトリで **npm install** を実行し、内容を zip 化して (`index.js` は zip のルートに配置する必要があります) 、`PurchasePet` Lambda 関数で使えるようにアップロードします。これをテストすると、JWT がメッセージ本文に含まれていないため、認可エラーが発生するはずです。

`index.js` のロジックを確認してください。60 行目付近に、トークンを検証し、購入ロジックで使用する ID 情報を含むデコード済みの情報を抽出する処理があることがわかります。

```js lines theme={null}
if(event.authToken) {
     jwt.verify(event.authToken, secret, function(err, decoded) {
         if(err) {
           console.log('failed jwt verify: ', err, 'auth: ', event.authToken);
           context.done('authorization failure', null);
         } else if(!decoded.email)
         {
           console.log('err, email missing in jwt', 'jwt: ', decoded);
           context.done('authorization failure', null);
         } else {
           userEmail = decoded.email;
           console.log('authorized, petId', petId, 'userEmail:', userEmail);
           dynamo.getItem({TableName:"Pets", Key:{username:"default"}}, readcb);
         }
     });
  } else {
     console.log('invalid authorization token', event.authToken);
     context.done('authorization failure', null);
  }
    ...
```

<div id="extract-profile-information-to-assign-a-buyer">
  ### 購入者を割り当てるためにユーザープロファイル情報を抽出する
</div>

最後の手順では、JWT をブラウザクライアントで使用するメソッドに渡します。

標準のメソッドでは、`Authorization` ヘッダーにベアラートークンを設定します。IAM 認可を無効にし、認可を OpenIDトークン のみに依存させることで、この方法を使用できます (その場合、`Authorization` ヘッダーを AWS Lambda 関数に渡されるイベントデータにマッピングする必要もあります) 。

ただし、IAM を使用している場合、AWS API Gateway は `Authorization` ヘッダーにメッセージの署名を格納するため、このヘッダーに JWT を挿入すると認証が機能しなくなります。この場合は、次のいずれかの方法を使用できます。

* JWT 用のカスタムヘッダーを追加する。
* カスタムヘッダーをメッセージ本文に含める。

カスタムヘッダーを使用する場合は、`pets/purchase` の POST メソッドの Integration Request に対しても、追加のマッピングが必要になります。

検証プロセスを簡単に保つには、JWT を POST リクエストの本文で AWS Lambda 関数に渡します。これを行うには、`home.js` の `buyPet` メソッドを更新し、本文から `userName` を削除して、次のように `authToken` を追加します。

```javascript lines theme={null}
function buyPet(user, id) {
    var apigClient = getSecureApiClient();
    var body = {
      petId:id,
      authToken: store.get('token')
    };

    apigClient.petsPurchasePost({}, body)
      .then(function(response) {
        console.log(response);
        $scope.pets = response.data;
        $scope.$apply();
      }).catch(function (response) {
        alert('buy pets failed');
        showError(response);
    });
}
```

コードを S3 バケットにアップロードし、ペットの購入を試してください。すると、表示されるメッセージに購入者のメールアドレスが含まれていることがわかります。

エラーが発生した場合は、シークレットキーが正しく設定されていることを再確認してください。トークンのデコードに関する問題を確認するには、[jwt.io](http://jwt.io/) が便利です。

<div id="summary">
  ## 概要
</div>

このチュートリアルでは、次のことを行いました。

* AWS Lambda 関数を使用するメソッドを含む API を AWS API Gateway で作成しました。
* IAM ロールを使用して API へのアクセスを保護しました。
* <Tooltip tip="IDプロバイダー（IdP）：デジタル ID を保存して管理するサービスです。" cta="用語集を見る" href="/ja/docs/glossary?term=SAML">SAML</Tooltip> <Tooltip tip="Security Assertion Markup Language (SAML)：パスワードを使わずに 2 者間で認証情報をやり取りできる標準化プロトコルです。" cta="用語集を見る" href="/ja/docs/glossary?term=identity+provider">IDプロバイダー</Tooltip> を IAM と統合し、API へのアクセスをユーザー基盤に紐付けました。
* ユーザーが Database とソーシャル接続のどちらで認証されたかに基づいて、異なるレベルのアクセスを提供しました。
* ロールの割り当てを強制するために Auth0 の Rule を使用しました。
* JWT を使用して追加の認可コンテキストを提供し、適切な Lambda 関数に ID 情報を渡しました。
