ID プール (フェデレーティッドアイデンティティ) の認証フロー - Amazon Cognito

ID プール (フェデレーティッドアイデンティティ) の認証フロー

Amazon Cognito は、エンドユーザーのために、デバイスおよびプラットフォーム全体で整合性が維持される一意の識別子を作成するために役立ちます。Amazon Cognito は、AWS リソースにアクセスするための、権限が制限された一時的な認証情報もアプリケーションに提供します。このページでは、Amazon Cognito での認証の基礎と、ID プール内のアイデンティティのライフサイクルについて説明します。

外部プロバイダーの認証フロー

Amazon Cognito で認証されるユーザーは、その認証情報をブートストラップするために複数ステップのプロセスを経由します。Amazon Cognito には、パブリックプロバイダーでの認証に、拡張認証と基本認証の 2 つの異なるフローがあります。

これらのフローの 1 つを完了すると、ロールのアクセスポリシーで定義されている AWS の他のサービスにアクセスできます。デフォルトは、Amazon Cognito コンソールは、Amazon Cognito Sync ストアと Amazon Mobile Analytics へのアクセス権を持つロールを作成します。その他のアクセス権を付与する方法の詳細については、「IAM ロール」を参照してください。

拡張 (簡略化) 認証フロー

  1. GetId

  2. GetCredentialsForIdentity


                外部プロバイダーの拡張認証フロー

基本 (Classic) 認証フロー

  1. GetId

  2. GetOpenIdToken

  3. AssumeRoleWithWebIdentity


                外部プロバイダーの基本認証フロー

デベロッパーが認証した ID の認証フロー

デベロッパーが認証したアイデンティティ (ID プール) を使用する場合、クライアントは独自の認証システムでユーザーを検証するために、Amazon Cognito 外部のコードが含まれる異なる認証フローを使用します。Amazon Cognito 外部のコードは、外部のものであることが示されます。

拡張認証フロー

  1. デベロッパープロバイダ経由でのログイン (Amazon Cognito 外部のコード)

  2. ユーザーのログインの検証 (Amazon Cognito 外部のコード)

  3. GetOpenIdTokenForDeveloperIdentity

  4. GetCredentialsForIdentity


                デベロッパーが認証した拡張認証フロー

基本的な認証フロー

  1. デベロッパープロバイダ経由でのログイン (Amazon Cognito 外部のコード)

  2. ユーザーのログインの検証 (Amazon Cognito 外部のコード)

  3. GetOpenIdTokenForDeveloperIdentity

  4. AssumeRoleWithWebIdentity


                デベロッパーが認証した基本的な認証フロー

使用するべき認証フロー

ほとんどのお客様にとって、[Enhanced Flow] が正しい選択であり、[Basic Flow] に対して多くのメリットがあります。

  • デバイスで認証情報を取得するための 1 つ少ないネットワーク呼び出し。

  • すべてのコールは Amazon Cognito に対して行われるので、ネットワーク接続が 1 つ減ることにもなります。

  • アプリケーションにロールを埋め込む必要はなくなり、認証情報のブートストラッピングを開始するために必要なものは、ID プールの ID とリージョンのみになります。

2015 年 2 月以降、Amazon Cognito コンソールは拡張フローを使用されたコード例を表示しています。さらに、ID プールに拡張フローを使用するために必要なロールの関連付けがない場合、コンソールには通知が表示されます。

拡張フローがサポートされる最小の SDK バージョンを次に示します。

SDK (最小バージョン)

  • AWS SDK for iOS (2.0.14)

  • AWS SDK for Android (2.1.8)

  • AWS SDK for JavaScript (2.1.7)

  • AWS SDK for Unity (1.0.3)

  • AWS SDK for Xamarin (3.0.0.5)

コンソールで新しい ID プールを作成するときに、設定された複数のデフォルトロールを使用する場合は、[Basic Flow] の使用をお勧めします。

API の要約

GetId

GetId API コールは、Amazon Cognito で新しいアイデンティティを確立するために必要な最初のコールです。

認証されていないアクセス

Amazon Cognito には、アプリケーションで認証されていないゲストアクセスを許可する機能があります。この機能が ID プールで有効になっている場合、ユーザーはいつでも GetId API 経由で新しいアイデンティティ ID をリクエストできます。Amazon Cognito に後続のコールを実行するため、アプリケーションにはこのアイデンティティ ID をキャッシュすることが期待されます。AWS Mobile SDK と AWS SDK for JavaScript in the Browser には、このキャッシングを処理する認証情報プロバイダーがあります。

認証されたアクセス

パブリックログインプロバイダー (Facebook、Google+、Login with Amazon、または「Apple でサインイン」など) のサポートでアプリケーションを設定すると、ユーザーは、これらのプロバイダーでユーザーを識別するトークン (OAuth または OpenID Connect) を提供できるようになります。GetId の呼び出しで使用されると、Amazon Cognito は新しい認証されたアイデンティティを作成するか、その特定のログインに既に関連付けられているアイデンティティを返します。Amazon Cognito は、プロバイダーでトークンを検証し、以下を確実にすることでこれを行います。

  • トークンは有効で、設定されたプロバイダーからのものである

  • トークンの有効期限が切れていない

  • トークンがそのプロバイダーで作成されたアプリケーション識別子 (例えば、Facebook アプリ ID) と一致する

  • トークンがユーザー識別子と一致する

GetCredentialsForIdentity

GetCredentialsForIdentity API は、アイデンティティ ID を確立した後で呼び出すことができます。この API は GetOpenIdToken に続いて AssumeRoleWithWebIdentity を呼び出すのと機能的に同等です。

Amazon Cognito が AssumeRoleWithWebIdentity を代理で呼び出すには、それに関連付けられた IAM ロールが ID プールにある必要があります。これは、Amazon Cognito コンソール経由で実行する、または SetIdentityPoolRoles 操作を使用して手動で実行することがでいます (「API リファレンス」を参照)。

GetOpenIdToken

GetOpenIdToken API コールは、アイデンティティ ID を確立した後で呼び出されます。キャッシュされたアイデンティティ ID がある場合、これはアプリセッションの間に行う最初の呼び出しである可能性があります。

認証されていないアクセス

認証されていない ID のトークンを取得するには、アイデンティティ ID そのもののみが必要です。認証された ID または無効にされた ID の認証されていないトークンを取得することはできません。

認証されたアクセス

認証済みの ID がある場合、その ID に既に関連付けられたログイン用に、少なくとも 1 つのトークンを渡す必要があります。GetOpenIdToken の呼び出し中に渡されるすべてのトークンは、前に説明したのと同じ検証を渡す必要があります。いずれかのトークンが失敗すると、呼び出し全体が失敗します。GetOpenIdToken 呼び出しからの応答には、アイデンティティ ID も含まれます。これは、渡すアイデンティティ ID が、返される ID とは限らないためです。

ログインのリンク

既に任意の ID と関連付けられていないログインのトークンを渡すと、そのログインは関連付けられた ID に「リンクしている」と見なされます。パブリックプロバイダーごとに、1 つのログインのみをリンクできます。複数のログインをパブリックプロバイダーにリンクしようとすると、ResourceConflictException が発生します。ログインが単純に既存の ID にリンクされている場合、GetOpenIdToken から返されるアイデンティティ ID は、渡された ID と同じになります。

ID の結合

現在、特定の ID にリンクされていないが、別の ID にリンクされているログインに対してトークンを渡すと、2 つの ID が結合されます。いったん結合されると、1 つの ID は、すべての関連ログインの親/所有者になり、もう 1 つは無視されます。この場合、親/所有者のアイデンティティ ID が返されます。この値が異なる場合は、ローカルキャッシュを更新する必要があります (AWS Mobile SDK または AWS SDK for JavaScript in the Browser のプロバイダーを使用している場合は、プロバイダーがこれを処理します)。

GetOpenIdTokenForDeveloperIdentity

GetOpenIdTokenForDeveloperIdentity API は、デベロッパーが認証した ID を使用するときに、デバイスから GetId と GetOpenIdToken の使用を置き換えます。この API コールは AWS 認証情報で署名されているため、Amazon Cognito は、API コールで指定されたユーザー識別子が有効であることを信頼できます。これは、Amazon Cognito が実行するトークン検証を外部プロバイダーに置き換えます。

この API のペイロードには、デベロッパープロバイダーのキーとシステムでのユーザーの識別子としての値が含まれている必要があるログインマップが含まれます。ユーザー識別子がまだ既存のアイデンティティに既にリンクされていない場合は、Amazon Cognito が新しいアイデンティティを作成して、新しいアイデンティティ ID と、そのアイデンティティの OpenId Connect を返します。ユーザー識別子が既にリンクされている場合は、Amazon Cognito が既存のアイデンティティ ID と OpenId Connect トークンを返します。

ログインのリンク

外部プロバイダーと同様に、既に ID に関連付けられていない追加のログインを指定すると、それらのログインがその ID に暗黙的にリンクされます。外部プロバイダーのログインを ID にリンクする場合、ユーザーはそのプロバイダーで外部プロバイダーの認証フローを使用できますが、GetId または GetOpenIdToken を呼び出すときに、ログインマップでデベロッパープロバイダー名を使用することはできません。

ID の結合

Amazon Cognito は、デベロッパーが認証したアイデンティティを使用して、MergeDeveloperIdentities API 経由での暗黙的なマージと明示的なマージの両方をサポートします。この明示的なマージにより、システムでユーザー識別子を持つ 2 つのアイデンティティを、1 つのアイデンティティとしてマークできます。ソースと宛先のユーザー識別子を指定するだけで、Amazon Cognito がそれらをマージします。次回にいずれかのユーザー識別子に対して OpenId Connect トークンをリクエストすると、同じアイデンティティ ID が返されます。

AssumeRoleWithWebIdentity

OpenID Connect トークンを取得したら、AWS Security Token Service (STS) の AssumeRoleWithWebIdentity API コールを通じて、これを一時的な AWS 認証情報と交換することができます。このコールは、他のパブリックプロバイダーからのトークンの代わりに Amazon Cognito トークンを渡すことを除いて、Facebook、Google+、Login with Amazon、または「Apple でサインイン」を直接使用している場合と変わりありません。

作成できる ID の数には制限がないため、ユーザーに付与されるアクセス権限を理解することが重要です。アプリケーション用の 2 つの異なるロールを持つことをお勧めします (1 つは認証されていないユーザー用で、もう 1 つは認証されたユーザー用)。Amazon Cognito コンソールは、最初に ID プールをセットアップするときにデフォルトでこれらを作成します。これら 2 つのロールのアクセスポリシーはまったく同じであり、Amazon Cognito Sync へのアクセス権とともに、Amazon Mobile Analytics にイベントを送信するアクセス権をユーザーに付与します。これらロールは、ニーズに合わせて変更してください。

詳細情報 ロールの信頼とアクセス権限.