

AWS SDK for JavaScript v2 はサポート終了となりました。[AWS SDK for JavaScript v3](https://docs.aws.amazon.com//sdk-for-javascript/v3/developer-guide/) に移行することをお勧めします。その他の詳細、移行方法については、こちらの[発表内容](https://aws.amazon.com/blogs//developer/announcing-end-of-support-for-aws-sdk-for-javascript-v2/)を参照してください。

# 認証情報の設定
<a name="setting-credentials"></a>

AWS は認証情報を使用して、サービスを呼び出しているユーザーと、リクエストされたリソースへのアクセスが許可されているかを識別します。

ウェブブラウザでも、Node.js サーバーでも、JavaScript コードは API を介してサービスにアクセスする前に有効な認証情報を取得する必要があります。認証情報は、`AWS.Config` を使用して設定オブジェクトでグローバルに設定することも、認証情報をサービスオブジェクトに直接渡してサービスごとに設定することもできます。

ウェブブラウザで Node.js と JavaScript の間で異なる認証情報を設定する方法はいくつかあります。このセクションのトピックでは、Node.js またはウェブブラウザで認証情報を設定する方法について説明します。いずれの場合も、オプションは推奨順に表示されています。

## 認証情報のベストプラクティス
<a name="credentials-best-practices"></a>

認証情報を正しく設定することで、ミッションクリティカルなアプリケーションに影響を与えたり重要なデータを侵害する可能性があるセキュリティ問題への露出を最小限に抑えながら、アプリケーションまたはブラウザスクリプトが必要なサービスおよびリソースにアクセスできるようにします。

認証情報を設定するときに適用する重要な原則は、常に自分のタスクに必要な最小限の権限を付与することです。最小限のアクセス許可を超えるアクセス許可を提供し、その結果、セキュリティ問題が後で発見されてそれを修正するよりも、リソースに対する最小限のアクセス許可を提供し、必要に応じてさらにアクセス許可を追加する方が安全です。例えば、Amazon S3 バケット内のオブジェクトや DynamoDB テーブル内のオブジェクトなど、個々のリソースを読み書きする必要がある場合を除き、これらのアクセス許可を読み取り専用に設定します。

最小権限の付与の詳細については、「*IAM ユーザーガイド*」で「ベストプラクティス」トピックの「[最小特権を付与する](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)」セクションを参照してください。

**警告**  
アプリケーションやブラウザスクリプト内で認証情報をハードコードすることは可能ですが、そうしないことをお勧めします。認証情報をハードコーディングすると、機密情報を公開するリスクがあります。

アクセスキーを管理する方法の詳細については、「AWS 全般のリファレンス」の「[AWS アクセスキーを管理するためのベストプラクティス](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html)」を参照してください。

**Topics**
+ [認証情報のベストプラクティス](#credentials-best-practices)
+ [Node.js での認証情報の設定](setting-credentials-node.md)
+ [ウェブブラウザでの認証情報の設定](setting-credentials-browser.md)

# Node.js での認証情報の設定
<a name="setting-credentials-node"></a>

Node.js では、SDK に認証情報を提供する方法がいくつかあります。これらの中には、より安全なものもあれば、アプリケーションの開発中により便利に使えるものもあります。Node.js で認証情報を取得する場合は、環境変数やロードした JSON ファイルなど、複数のソースに依存するように注意してください。変更が行われたことに気付かずに、コードの実行に使用されるアクセス許可を変更してしまう可能性があります。

推奨の順序で認証情報を提供する方法は次のとおりです。

1. Amazon EC2 の AWS Identity and Access Management (IAM) ロールからロード

1. 共有認証情報ファイル (`~/.aws/credentials`) から読み込む

1. 環境変数から読み込む

1. ディスク上の JSON ファイルから読み込む

1. JavaScript SDK によって提供されるその他の認証情報プロバイダークラス

SDK で利用できる認証情報ソースが複数ある場合、デフォルトの選択優先順位は次のとおりです。

1. サービスクライアントコンストラクタで明示的に設定されている認証情報

1. 環境変数

1. 共有認証情報ファイル

1. ECS 認証情報プロバイダーからロードされた認証情報 (該当する場合)

1. 共有 AWS 設定ファイルまたは共有認証情報ファイルで指定された認証情報プロセスを使用して取得された認証情報です。詳細については、「[設定された認証情報プロセスを使用して Node.js で認証情報をロードする](loading-node-credentials-configured-credential-process.md)」を参照してください。

1. Amazon EC2 インスタンスの認証情報プロバイダーを使用して AWS IAM からロードされた認証情報 (インスタンスメタデータで設定されている場合)

詳細については、API リファレンスの [https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Credentials.html](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Credentials.html) および [https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CredentialProviderChain.html](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CredentialProviderChain.html) を参照してください。

**警告**  
アプリケーションで AWS 認証情報をハードコードすることは可能ですが、そうしないことをお勧めします。認証情報をハードコーディングすると、アクセスキー ID とシークレットアクセスキーが公開される危険があります。

このセクションのトピックでは、認証情報を Node.js にロードする方法について説明します。

**Topics**
+ [Amazon EC2 の IAM ロールから認証情報を Node.js にロードする](loading-node-credentials-iam.md)
+ [Node.js Lambda 関数の認証情報をロードする](loading-node-credentials-lambda.md)
+ [共有認証情報ファイルから Node.js に認証情報をロードする](loading-node-credentials-shared.md)
+ [環境変数から Node.js への認証情報のロード](loading-node-credentials-environment.md)
+ [JSON ファイルから認証情報を Node.js にロードする](loading-node-credentials-json-file.md)
+ [設定された認証情報プロセスを使用して Node.js で認証情報をロードする](loading-node-credentials-configured-credential-process.md)

# Amazon EC2 の IAM ロールから認証情報を Node.js にロードする
<a name="loading-node-credentials-iam"></a>

Amazon EC2 インスタンスで Node.js アプリケーションを実行する場合、Amazon EC2 の IAM ロールを活用して自動的に認証情報をインスタンスに提供できます。IAM ロールを使用するようにインスタンスを設定する場合、SDK はアプリケーションの IAM 認証情報を自動的に選択するため、手動で認証情報を提供する必要がなくなります。

Amazon EC2 インスタンスへの IAM ロールの追加の詳細については、「*AWS SDK とツールのリファレンスガイド*」の「[Amazon EC2 インスタンス用の IAM ロールを使用する](https://docs.aws.amazon.com/sdkref/latest/guide/access-iam-roles-for-ec2.html)」を参照してください。

# Node.js Lambda 関数の認証情報をロードする
<a name="loading-node-credentials-lambda"></a>

AWS Lambda 関数を作成するときは、その関数を実行する許可を持つ特別な IAM ロールを作成する必要があります。このロールは、*実行ロール*と呼ばれます。Lambda 関数を設定するときは、作成した IAM ロールを対応する実行ロールとして指定する必要があります。

実行ロールは、実行と他のウェブサービスを呼び出すために必要な認証情報を Lambda 関数に提供します。その結果、Lambda 関数内で記述した Node.js コードに認証情報を提供する必要はありません。

Lambda 実行ロールの詳細については、*AWS Lambda デベロッパーガイド*の[許可の管理: IAM ロール (実行ロール) の使用](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role)を参照してください。

# 共有認証情報ファイルから Node.js に認証情報をロードする
<a name="loading-node-credentials-shared"></a>

AWS の認証情報データは、SDK とコマンドラインインターフェイスで使用される共有ファイルに保存できます。SDK for JavaScript は、ロード時に共有認証情報ファイルを検索します。これは「credentials」という名前です。共有認証情報ファイルを保存する場所は、オペレーティングシステムによって異なります。
+ Linux、Unix、および macOS の共有認証情報ファイル: `~/.aws/credentials`
+ Windows の共有認証情報ファイル: `C:\Users\USER_NAME\.aws\credentials`

認証情報ファイルがまだない場合は、「[AWS による SDK 認証](getting-your-credentials.md)」を参照してください。これらの手順を実行すると、認証情報ファイルに次のようなテキストが表示されます。ここで、*<YOUR\$1ACCESS\$1KEY\$1ID>* はアクセスキー ID、*<YOUR\$1SECRET\$1ACCESS\$1KEY>* はシークレットアクセスキーです。

```
[default]
aws_access_key_id = <YOUR_ACCESS_KEY_ID>
aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>
```

このファイルが使用されている例については、「[Node.js での使用開始](getting-started-nodejs.md)」を参照してください。

`[default]` セクションの見出しは、デフォルトのプロファイルと認証情報の関連する値を指定します。同じ共有設定ファイルに、それぞれ独自の認証情報を持つ追加のプロファイルを作成できます。次の例は、デフォルトプロファイルと 2 つの追加プロファイルを含む設定ファイルを示しています。

```
[default] ; default profile
aws_access_key_id = <DEFAULT_ACCESS_KEY_ID>
aws_secret_access_key = <DEFAULT_SECRET_ACCESS_KEY>
    
[personal-account] ; personal account profile
aws_access_key_id = <PERSONAL_ACCESS_KEY_ID>
aws_secret_access_key = <PERSONAL_SECRET_ACCESS_KEY>
    
[work-account] ; work account profile
aws_access_key_id = <WORK_ACCESS_KEY_ID>
aws_secret_access_key = <WORK_SECRET_ACCESS_KEY>
```

デフォルトでは、SDK は `AWS_PROFILE` 環境変数を確認して、使用するプロファイルを決定します。環境に `AWS_PROFILE` 変数が設定されていない場合、SDK は `[default]` プロファイルの認証情報を使用します。代替プロファイルのいずれかを使用するには、`AWS_PROFILE` 環境変数の値を変更します。たとえば、上記の設定ファイルを指定する場合、作業アカウントから認証情報を使用するには、`AWS_PROFILE` 環境変数を `work-account` (使用しているオペレーティングシステムに合わせたもの) に設定します。​

**注記**  
環境変数を設定するときは、必ず後で適切なアクション (使用しているオペレーティングシステムの必要に応じて) を行って、シェルまたはコマンド環境で変数を使用できるようにしてください。

環境変数を設定 (必要に応じて) した後、SDK を使用する `script.js` という名前の JavaScript ファイルを次のように実行できます。

```
$ node script.js
```

SDK をロードする前に `process.env.AWS_PROFILE` を設定するか、次の例に示すように認証情報プロバイダーを選択することによって、SDK で使用されるプロファイルを明示的に選択することもできます。

```
var credentials = new AWS.SharedIniFileCredentials({profile: 'work-account'});
AWS.config.credentials = credentials;
```

# 環境変数から Node.js への認証情報のロード
<a name="loading-node-credentials-environment"></a>

SDK は、環境内の変数として設定されている AWS 認証情報を自動的に検出して SDK リクエストに使用するため、アプリケーションで認証情報を管理する必要がなくなります。認証情報を提供するために設定する環境変数は次のとおりです。
+ `AWS_ACCESS_KEY_ID`
+ `AWS_SECRET_ACCESS_KEY`
+ `AWS_SESSION_TOKEN`

環境変数の設定の詳細については、「*AWS SDK とツールのリファレンスガイド*」の「[環境変数のサポート](https://docs.aws.amazon.com/sdkref/latest/guide/environment-variables.html)」を参照してください。

# JSON ファイルから認証情報を Node.js にロードする
<a name="loading-node-credentials-json-file"></a>

`AWS.config.loadFromPath` を使用して、ディスク上の JSON ドキュメントから設定と認証情報をロードできます。指定するパスは、プロセスの現在の作業ディレクトリからの相対パスです。たとえば、次の内容の `'config.json'` ファイルから認証情報をロードするとします。

```
{ "accessKeyId": <YOUR_ACCESS_KEY_ID>, "secretAccessKey": <YOUR_SECRET_ACCESS_KEY>, "region": "us-east-1" }
```

この場合は、次のコードを使用します。

```
var AWS = require("aws-sdk");
AWS.config.loadFromPath('./config.json');
```

**注記**  
JSON ドキュメントから設定データを読み込むと、既存の設定データがすべてリセットされます。この手法を使用した後で、追加の設定データを追加してください。JSON ドキュメントからの認証情報のロードはブラウザスクリプトではサポートされていません。

# 設定された認証情報プロセスを使用して Node.js で認証情報をロードする
<a name="loading-node-credentials-configured-credential-process"></a>

SDK に組み込まれていないメソッドを使用して認証情報を入手できます。これを行うには、共有 AWS conﬁg ファイルまたは共有認証情報ファイルで認証情報プロセスを指定します。`AWS_SDK_LOAD_CONFIG` 環境変数を任意の値に設定している場合、SDK は認証情報ファイルに指定されているプロセス (ある場合) よりも、設定ファイルに指定されているプロセスを優先します。

共有 AWS 設定ファイルまたは共有認証情報ファイルから認証情報プロセスを指定する方法の詳細については、*AWS CLI コマンドリファレンス*、特に[外部プロセスから認証情報を取得する](https://docs.aws.amazon.com/cli/latest/topic/config-vars.html#sourcing-credentials-from-external-processes)に関する情報を参照してください。

`AWS_SDK_LOAD_CONFIG` 環境変数を使用する方法については、このドキュメントで「[共有 Config ファイルの使用](setting-region.md#setting-region-config-file)」を参照してください。

# ウェブブラウザでの認証情報の設定
<a name="setting-credentials-browser"></a>

ブラウザスクリプトから SDK に認証情報を提供する方法はいくつかあります。これらの中には、より安全なものもあれば、スクリプトの開発中により便利に使えるものもあります。推奨の順序で認証情報を提供する方法は次のとおりです。

1. Amazon Cognito アイデンティティを使用してユーザーを認証し、認証情報を提供する

1. ウェブフェデレーテッド ID を使用する

1. スクリプトにハードコードする

**警告**  
スクリプトに AWS 認証情報をハードコーディングすることはお勧めしません。認証情報をハードコーディングすると、アクセスキー ID とシークレットアクセスキーが公開される危険があります。

**Topics**
+ [Amazon Cognito アイデンティティを使用してユーザーを認証する](loading-browser-credentials-cognito.md)
+ [ユーザー認証のためのウェブフェデレーテッド ID の使用](loading-browser-credentials-federated-id.md)
+ [ウェブフェデレーティッド ID の例](config-web-identity-examples.md)

# Amazon Cognito アイデンティティを使用してユーザーを認証する
<a name="loading-browser-credentials-cognito"></a>

ブラウザスクリプトの AWS 認証情報を入手するには、Amazon Cognito アイデンティティ認証情報オブジェクトの `AWS.CognitoIdentityCredentials` を使用することをお勧めします。Amazon Cognito では、サードパーティのアイデンティティプロバイダーによるユーザーの認証が可能です。

Amazon Cognito アイデンティティを使用するには、最初に Amazon Cognito コンソールでアイデンティティプールを作成する必要があります。ID プールは、アプリケーションがユーザーに提供する ID のグループを表します。ユーザーに与えられたアイデンティティは、各ユーザーアカウントを一意に識別します。Amazon Cognito ID は認証情報ではありません。これらは AWS Security Token Service (AWS STS) のウェブ ID フェデレーションサポートを使用して認証情報と交換されます。

Amazon Cognito は、`AWS.CognitoIdentityCredentials` オブジェクトを使用して、複数のアイデンティティプロバイダーにわたるアイデンティティの抽象化を管理するのに役立ちます。ロードされた ID は AWS STS の認証情報と交換されます。

## Amazon Cognito アイデンティティ認証情報オブジェクトの設定
<a name="browser-cognito-configuration"></a>

まだ作成していない場合は、`AWS.CognitoIdentityCredentials` を設定する前に [Amazon Cognito コンソール](https://console.aws.amazon.com/cognito)でブラウザスクリプトによりアイデンティティプールを作成してください。アイデンティティプール用の認証済み IAM ロールと未認証 IAM ロールの両方を作成して関連付けます。

認証されていないユーザーは ID が検証されないため、このロールはアプリケーションのゲストユーザーに適切です。または、ユーザーの ID が検証されているかどうかが重要ではない場合に適切です。認証されているユーザーは、自分の ID を確認するサードパーティーの ID プロバイダーを介してアプリケーションにログインします。リソースの許可の範囲を適切に設定し、認証されていないユーザーからのアクセスを許可しないようにします。

アタッチ済みの ID プロバイダーで ID プールを設定すると、`AWS.CognitoIdentityCredentials` を使用してユーザーを認証できます。`AWS.CognitoIdentityCredentials` を使用するようにアプリケーションを設定するには、`credentials` またはサービス別の設定の `AWS.Config` プロパティを設定します。次の例では `AWS.Config` を使用しています。

```
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: 'us-east-1:1699ebc0-7900-4099-b910-2df94f52a030',
  Logins: { // optional tokens, used for authenticated login
    'graph.facebook.com': 'FBTOKEN',
    'www.amazon.com': 'AMAZONTOKEN',
    'accounts.google.com': 'GOOGLETOKEN'
  }
});
```

オプションの `Logins` プロパティは、ID プロバイダー名の ID トークンへのマッピングです。ID プロバイダーからのトークンの取得方法は、使用するプロバイダーによって異なります。たとえば、Facebook を ID プロバイダーとして使用する場合は、`FB.login`Facebook SDK[ の ](https://developers.facebook.com/docs/facebook-login/web) 関数を使用して ID プロバイダートークンを取得します。

```
FB.login(function (response) {
  if (response.authResponse) { // logged in
    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      IdentityPoolId: 'us-east-1:1699ebc0-7900-4099-b910-2df94f52a030',
      Logins: {
        'graph.facebook.com': response.authResponse.accessToken
      }
    });

    s3 = new AWS.S3; // we can now create our service object

    console.log('You are now logged in.');
  } else {
    console.log('There was a problem logging you in.');
  }
});
```

## 認証されていないユーザーから認証されたユーザーへの切り替え
<a name="browser-switching-unauthenticated-users"></a>

Amazon Cognito は、認証されたユーザーと認証されていないユーザーの両方をサポートします。認証されていないユーザーは、ID プロバイダーのいずれにもログインしていない場合でも、リソースにアクセスできます。このレベルのアクセスは、ログインする前にユーザーにコンテンツを表示するのに便利です。認証されていない各ユーザーは、個別にログインして認証していない場合でも Amazon Cognito で一意のアイデンティティを持ちます。

### 認証されていないユーザーとしての開始
<a name="browser-switching-initially-unauthenticated-user"></a>

ユーザーは通常、認証されていないロールから開始します。このロールでは、`Logins` プロパティを使用しないで設定オブジェクトの認証情報プロパティを設定します。この場合、デフォルト設定は次のようになります。

```
// set the default config object
var creds = new AWS.CognitoIdentityCredentials({
 IdentityPoolId: 'us-east-1:1699ebc0-7900-4099-b910-2df94f52a030'
});
AWS.config.credentials = creds;
```

### 認証されたユーザーへの切り替え
<a name="switch-to-authenticated"></a>

認証されていないユーザーが ID プロバイダーにログインしたときに、トークンがあれば、カスタム関数を呼び出して認証情報オブジェクトを更新し `Logins` トークンを追加することで、認証されていないユーザーを認証されたユーザーに切り替えることができます。

```
// Called when an identity provider has a token for a logged in user
function userLoggedIn(providerName, token) {
  creds.params.Logins = creds.params.Logins || {};
  creds.params.Logins[providerName] = token;
                    
  // Expire credentials to refresh them on the next request
  creds.expired = true;
}
```

また、`CognitoIdentityCredentials` オブジェクトを作成することもできます。その場合、作成した既存のサービスオブジェクトの認証情報プロパティをリセットする必要があります。サービスオブジェクトは、オブジェクトの初期化時にのみグローバル設定から読み込まれます。

`CognitoIdentityCredentials` オブジェクトの詳細については、AWS SDK for JavaScript API リファレンスの [https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityCredentials.html) を参照してください。

# ユーザー認証のためのウェブフェデレーテッド ID の使用
<a name="loading-browser-credentials-federated-id"></a>

ウェブ ID フェデレーションを使用して AWS リソースにアクセスするように個々のアイデンティティプロバイダーを直接設定できます。AWS は現在、複数のアイデンティティプロバイダーによるウェブ ID フェデレーションを使用したユーザー認証をサポートしています。
+ [Login with Amazon](https://login.amazon.com)
+ [Facebook Login](https://www.facebook.com/about/login)
+ [Google Sign-in](https://developers.google.com/identity/)

まず、アプリケーションがサポートするプロバイダーにアプリケーションを登録する必要があります。次に、IAM ロールを作成し、その許可を設定します。作成した IAM ロールは、それぞれのアイデンティティプロバイダーを介して自分に設定された許可を付与するのに使用されます。例えば、Facebook を介してログインしたユーザーに、自分が管理している特定の Amazon S3 バケットへの読み取りアクセスを許可するロールを設定できます。

IAM ロールに特権を設定し、選択したアイデンティティプロバイダーにアプリケーションを登録したら、次に示すように、ヘルパーコードを使用して IAM ロールの認証情報を取得するように SDK を設定できます。

```
AWS.config.credentials = new AWS.WebIdentityCredentials({
   RoleArn: 'arn:aws:iam::<AWS_ACCOUNT_ID>/:role/<WEB_IDENTITY_ROLE_NAME>',
   ProviderId: 'graph.facebook.com|www.amazon.com', // this is null for Google
   WebIdentityToken: ACCESS_TOKEN
});
```

`ProviderId` パラメータの値は、指定された ID プロバイダーによって異なります。`WebIdentityToken` パラメータの値は、ID プロバイダーへの正常なログインから取得されたアクセストークンです。各 ID プロバイダーのアクセストークンの設定方法および取得方法の詳細については、ID プロバイダーのドキュメントを参照してください。

## ステップ 1: ID プロバイダーへの登録
<a name="config-web-identity-register"></a>

開始するには、サポートを選択した ID プロバイダーにアプリケーションを登録します。アプリケーションと、場合によってはその作者を識別する情報を提供するように求められます。これにより、ID プロバイダーは、誰が自分のユーザー情報を受信しているのかを把握することができます。いずれの場合も、ID プロバイダーは、ユーザーロールを設定するために使用するアプリケーション ID を発行します。

## ステップ 2: Iアイデンティティプロバイダー用の IAM ロールを作成する
<a name="config-web-identity-role"></a>

アイデンティティプロバイダーからアプリケーション ID を取得したら、IAM コンソール ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)) に移動し、新しい IAM ロールを作成します。

**アイデンティティプロバイダー用の IAM ロールを作成するには**

1. コンソールの [**ロール**] セクションに移動し、[**新しいロールの作成**] を選択します。

1. **facebookIdentity** など、新しいロールの使用状況を追跡するのに役立つ名前を入力し、[**次のステップ**] を選択します。

1. [**ロールタイプの選択**] で、[**ID プロバイダーアクセス用のロール**] を選択します。

1. [**ウェブ ID プロバイダーにアクセスを付与**] で、[**選択**] を選択します。

1. [**アイデンティティプロバイダー**] リストから、この IAM ロールに使用するアイデンティティプロバイダーを選択します。  
![\[ID プロバイダーアクセス用のロールの選択\]](http://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/images/iam-provider-select.png)

1. ID プロバイダーによって提供されたアプリケーション ID を [**アプリケーション ID**] に入力してから、[**次のステップ**] を選択します。

1. 公開するリソースに対するアクセス許可を設定し、特定のリソースに対して特定のオペレーションへのアクセスを許可します。IAM の許可に関する詳細については、*IAM ユーザーガイド*の [AWS IAM ユーザーの許可の概要](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_permissions.html)を参照してください。ロールの信頼関係を確認し、必要に応じてカスタマイズしてから、[**次のステップ**] を選択します。

1. 必要な追加のポリシーをアタッチしてから、[**次のステップ**] を選択します。IAM ポリシーの詳細については、*IAM ユーザーガイド*の [IAM ポリシーの概要](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)を参照してください。

1. 新しいロール情報を確認してから、[**ロールの作成**] を選択します。

特定のユーザー ID へのスコーピングなど、他の制約をロールに加えることができます。ロールがリソースへの書き込みアクセス許可を付与する場合は、正しい権限を持つユーザーにロールを正しく適用するようにしてください。そうしないと、Amazon、Facebook、または Google の ID を持つユーザーはだれでもアプリケーションのリソースに変更を加えることができます。

ウェブ ID フェデレーションの詳細については、*IAM ユーザーガイド*の[ウェブ ID フェデレーションについて](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html)を参照してください。

## ステップ 3: ログイン後にプロバイダーアクセストークンを取得する
<a name="config-web-identity-obtain-token"></a>

ID プロバイダーの SDK を使用して、アプリケーションのログインアクションを設定します。OAuth または OpenID を使用してユーザーログインを可能にする JavaScript SDK を、ID プロバイダーからダウンロードしてインストールできます。SDK コードをダウンロードしてアプリケーションに設定する方法については、ID プロバイダーの SDK ドキュメントを参照してください。
+ [Login with Amazon](https://login.amazon.com/website)
+ [Facebook Login](https://developers.facebook.com/docs/javascript)
+ [Google Sign-in](https://developers.google.com/identity/)

## ステップ 4: 一時的な認証情報を取得する
<a name="config-web-identity-get-credentials"></a>

アプリケーション、ロール、およびリソースに対するアクセス許可を設定したら、一時的な認証情報を取得するためのコードをアプリケーションに追加します。これらの認証情報は、ウェブ ID フェデレーションを使用して AWS Security Token Service 経由で提供されます。ユーザーは ID プロバイダーにログインし、ID プロバイダーはアクセストークンを返します。このアイデンティティプロバイダー用に作成した IAM ロールの ARN を使用して `AWS.WebIdentityCredentials` オブジェクトを設定します。

```
AWS.config.credentials = new AWS.WebIdentityCredentials({
    RoleArn: 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<WEB_IDENTITY_ROLE_NAME>',
    ProviderId: 'graph.facebook.com|www.amazon.com', // Omit this for Google
    WebIdentityToken: ACCESS_TOKEN // Access token from identity provider
});
```

その後、作成されるサービスオブジェクトは適切な認証情報を持ちます。`AWS.config.credentials` プロパティを設定する前に作成されたオブジェクトには、現在の認証情報はありません。

アクセストークンを取得する前に `AWS.WebIdentityCredentials` を作成することもできます。これにより、認証情報に依存するサービスオブジェクトを、アクセストークンをロードする前に作成できます。これを行うには、`WebIdentityToken` パラメータを指定せずに認証情報オブジェクトを作成します。

```
AWS.config.credentials = new AWS.WebIdentityCredentials({
  RoleArn: 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<WEB_IDENTITY_ROLE_NAME>',
  ProviderId: 'graph.facebook.com|www.amazon.com' // Omit this for Google
});

// Create a service object
var s3 = new AWS.S3;
```

次に、アクセストークンを含む ID プロバイダー SDK からのコールバックで `WebIdentityToken` を設定します。

```
AWS.config.credentials.params.WebIdentityToken = accessToken;
```

# ウェブフェデレーティッド ID の例
<a name="config-web-identity-examples"></a>

ブラウザの JavaScript で認証情報を取得するためにウェブフェデレーテッド ID を使用する例をいくつか示します。これらの例は、ID プロバイダーがアプリケーションにリダイレクトできるように、http:// または https:// ホストスキームから実行する必要があります。

## Login with Amazon の例
<a name="config-web-identity-amazon-login-example"></a>

次のコードは、Login with Amazon を ID プロバイダーとして使用する方法を示しています。

```
<a href="#" id="login">
  <img border="0" alt="Login with Amazon"
    src="https://images-na.ssl-images-amazon.com/images/G/01/lwa/btnLWA_gold_156x32.png"
    width="156" height="32" />
</a>
<div id="amazon-root"></div>
<script type="text/javascript">
  var s3 = null;
  var clientId = 'amzn1.application-oa2-client.1234567890abcdef'; // client ID
  var roleArn = 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<WEB_IDENTITY_ROLE_NAME>';

  window.onAmazonLoginReady = function() {
    amazon.Login.setClientId(clientId); // set client ID

    document.getElementById('login').onclick = function() {
      amazon.Login.authorize({scope: 'profile'}, function(response) {
        if (!response.error) { // logged in
          AWS.config.credentials = new AWS.WebIdentityCredentials({
            RoleArn: roleArn,
            ProviderId: 'www.amazon.com',
            WebIdentityToken: response.access_token
          });

          s3 = new AWS.S3();

          console.log('You are now logged in.');
        } else {
          console.log('There was a problem logging you in.');
        }
      });
    };
  };

  (function(d) {
    var a = d.createElement('script'); a.type = 'text/javascript';
    a.async = true; a.id = 'amazon-login-sdk';
    a.src = 'https://api-cdn.amazon.com/sdk/login1.js';
    d.getElementById('amazon-root').appendChild(a);
  })(document);
</script>
```

## Facebook Login の例
<a name="config-web-identity-facebook-login-example"></a>

次のコードは、Facebook Login を ID プロバイダーとして使用する方法を示しています。

```
<button id="login">Login</button>
<div id="fb-root"></div>
<script type="text/javascript">
var s3 = null;
var appId = '1234567890'; // Facebook app ID
var roleArn = 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<WEB_IDENTITY_ROLE_NAME>';

window.fbAsyncInit = function() {
  // init the FB JS SDK
  FB.init({appId: appId});

  document.getElementById('login').onclick = function() {
    FB.login(function (response) {
      if (response.authResponse) { // logged in
        AWS.config.credentials = new AWS.WebIdentityCredentials({
          RoleArn: roleArn,
          ProviderId: 'graph.facebook.com',
          WebIdentityToken: response.authResponse.accessToken
        });

        s3 = new AWS.S3;

        console.log('You are now logged in.');
      } else {
        console.log('There was a problem logging you in.');
      }
    });
  };
};

// Load the FB JS SDK asynchronously
(function(d, s, id){
   var js, fjs = d.getElementsByTagName(s)[0];
   if (d.getElementById(id)) {return;}
   js = d.createElement(s); js.id = id;
   js.src = "//connect.facebook.net/en_US/all.js";
   fjs.parentNode.insertBefore(js, fjs);
 }(document, 'script', 'facebook-jssdk'));
</script>
```

## Google\$1 Sign-in の例
<a name="config-web-identity-google-login-example"></a>

次のコードは、Google\$1 Sign-in を ID プロバイダーとして使用する方法を示しています。Google からのウェブ ID フェデレーションに使用されるアクセストークンは、他の ID プロバイダーのように `access_token` ではなく `response.id_token` に保存されています。

```
<span
  id="login"
  class="g-signin"
  data-height="short"
  data-callback="loginToGoogle"
  data-cookiepolicy="single_host_origin"
  data-requestvisibleactions="http://schemas.google.com/AddActivity"
  data-scope="https://www.googleapis.com/auth/plus.login">
</span>
<script type="text/javascript">
  var s3 = null;
  var clientID = '1234567890.apps.googleusercontent.com'; // Google client ID
  var roleArn = 'arn:aws:iam::<AWS_ACCOUNT_ID>:role/<WEB_IDENTITY_ROLE_NAME>';

  document.getElementById('login').setAttribute('data-clientid', clientID);
  function loginToGoogle(response) {
    if (!response.error) {
      AWS.config.credentials = new AWS.WebIdentityCredentials({
        RoleArn: roleArn, WebIdentityToken: response.id_token
      });

      s3 = new AWS.S3();

      console.log('You are now logged in.');
    } else {
      console.log('There was a problem logging you in.');
    }
  }

  (function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/client:plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
  })();
 </script>
```