メニュー
Amazon Cognito
開発者ガイド (Version 最終更新日: 2016 年 7 月 28 日)

認証のフロー

Amazon Cognito は、デバイスやプラットフォームを問わず整合性が保たれた、一意の ID をエンドユーザーに対して作成できるようにします。Amazon Cognitoまた、AWS リソースにアクセスするための、権限が制限されている一時的な認証情報をアプリケーションに提供します。このページでは、Amazon Cognito での認証の基礎と、ID プール内の 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. GetCredentialsForIdentity

  5. 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 で新しい ID を確立するために必要な最初の呼び出しです。

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

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

認証されたアクセス

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

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

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

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

  • トークンはユーザー ID と一致する

GetCredentialsForIdentity

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

Amazon Cognito がユーザーに代わって AssumeRoleWithWebIdentity を呼び出すためには、ID プールに、それに関連付けられた IAM ロールがある必要があります。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 呼び出しで指定されたユーザー ID が有効であることを信頼できます。これにより、外部プロバイダーに対して Amazon Cognito が実行するトークン検証が置き換えられます。

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

ログインのリンク

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

ID の結合

Amazon Cognito は、開発者が認証した ID を使用して、MergeDeveloperIdentities API を通じた暗黙的な結合および明示的な結合の両方をサポートします。この明示的な結合により、システムでユーザー ID を持つ 2 つの ID を、1 つの ID としてマークできます。ソースとターゲットのユーザー ID を指定するだけで、Amazon Cognito によってそれらが結合されます。次回にいずれかのユーザー ID に対して OpenId Connect トークンをリクエストすると、同じアイデンティティ ID が返されます。

AssumeRoleWithWebIdentity

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

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

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