ユーザープール内のユーザーデバイスの使用 - Amazon Cognito

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ユーザープール内のユーザーデバイスの使用

Amazon Cognito ユーザープール API を使用してローカルユーザープールのユーザーをサインインすると、高度なセキュリティ機能からのユーザーのアクティビティログを各デバイスに関連付けることができます。また、信頼できるデバイスを使用している場合は、オプションでユーザーが多要素認証 (MFA) をスキップするのを可能にします。Amazon Cognito には、デバイス情報がまだ含まれていないサインインへのレスポンスにデバイスキーが含まれます。デバイスキーの形式は Region_UUID です。デバイスキー、Secure Remote Password (SRP) ライブラリ、およびデバイス認証を許可するユーザープールがあれば、アプリ内のユーザーに現在のデバイスを信頼するように求めることができ、サインイン時に MFA コードの入力を求める必要がなくなります。

記憶済みデバイスのセットアップ

Amazon Cognito ユーザープールでは、ユーザーの各デバイスを固有のデバイス識別子、つまりデバイスキーに関連付けることができます。サインイン時にデバイスキーを提示してデバイス認証を行うと、2 つの機能を利用できます。

  1. 高度なセキュリティ機能により、セキュリティと分析を目的として、特定のデバイスでのユーザーアクティビティをモニタリングできます。ユーザーがログインすると、アプリでは、オプションで各ユーザーとそのデバイスを認証して、アクティビティログにデバイス情報を追加することができます。

  2. デバイスを記憶することで、信頼できるデバイスの認証フローもサポートされます。これにより、ユーザーは、アプリのセキュリティ要件に適した期間、MFA なしでログインすることを選択できます。ユーザーに MFA コードの送信を再度求める場合は、ユーザーのデバイスの記憶状態を変更できます。

    記憶されているデバイスは、MFA がアクティブなユーザープールでのみ MFA をオーバーライドできます。

ユーザーが記憶されているデバイスでログインする場合、認証フロー中に追加のデバイス認証を実行する必要があります。詳細については、「デバイスでのサインイン」を参照してください。

ユーザープールの [サインインエクスペリエンス] タブの [デバイスの追跡] で、ユーザープールがデバイスを記憶するように設定します。Amazon Cognito コンソールを使用して記憶済みデバイス機能をセットアップするときは、[常に][User Opt-In] (ユーザーオプトイン)、および [いいえ] の 3 つのオプションがあります。

記憶しない

ユーザープールでは、ログイン時にデバイスを記憶するように求めるメッセージは表示されません。

常に記憶する

アプリがユーザーのデバイスを確認すると、ユーザープールは常にデバイスを記憶し、今後デバイスへのログインが成功しても MFA チャレンジを返しません。

ユーザーオプトイン

アプリがユーザーのデバイスを確認しても、ユーザープールは MFA チャレンジを自動的に抑制しません。デバイスを記憶するかどうかをユーザーが選択するようにユーザーに求める必要があります。

[常に記憶する] または [ユーザーオプトイン] を選択すると、ユーザーが未確認のデバイスからサインインするたびに、Amazon Cognito はデバイス ID キーとシークレットを生成します。デバイスキーは、ユーザーがデバイス認証を実行したときにアプリがユーザープールに送信する最初の識別子です。

確認済みの各ユーザーデバイスでは、自動的に記憶されるかオプトインされたかに関係なく、ユーザーがサインインするたびにデバイス識別子キーとシークレットを使用してデバイスを認証できます。

CreateUserPool または UpdateUserPool API リクエストで、ユーザープールの記憶デバイス設定を構成することもできます。詳細については、DeviceConfiguration のプロパティを参照してください。

Amazon Cognito ユーザープール API には記憶されているデバイスに対してさらに 2 つのオペレーションがあります。

  1. ListDevicesAdminListDevices は、ユーザーのデバイスキーとそのメタデータのリストを返します。

  2. GetDeviceAdminGetDevice は、単一のデバイスのデバイスキーとメタデータを返します。

  3. UpdateDeviceStatusAdminUpdateDeviceStatus は、ユーザーのデバイスを記憶済みまたは未記憶として設定します。

  4. ForgetDeviceAdminForgetDevice は、ユーザーの確認済みデバイスをプロファイルから削除します。

名前が Admin で始まる API オペレーションはサーバー側アプリで使用するもので、IAM 認証情報を使用して認証する必要があります。詳細については、「Amazon Cognito ユーザープール API とユーザープールのエンドポイントの使用」を参照してください。

デバイスキーの取得

ユーザーがユーザープール API を使用してサインインし、認証パラメータに DEVICE_KEY としてデバイスキーを含めない場合、Amazon Cognito はレスポンスに新しいデバイスキーを返します。クライアント側パブリックアプリでは、デバイスキーをアプリストレージに配置することで、今後のリクエストに含められるようになります。機密のサーバー側アプリで、ブラウザー Cookie または別のクライアント側トークンをユーザーのデバイスキーで設定します。

ユーザーが信頼できるデバイスを使用してサインインする前に、アプリはデバイスキーを確認して追加情報を提供する必要があります。デバイスキー、わかりやすい名前、パスワード検証ツール、およびソルトを使用してユーザーのデバイスを確認する ConfirmDevice リクエストを Amazon Cognito に生成します。ユーザープールでオプトインデバイス認証を設定した場合、Amazon Cognito は ConfirmDevice リクエストに、ユーザーは現在のデバイスを記憶するかどうかを選択する必要があるプロンプトで応答する必要があります。UpdateDeviceStatus リクエストでユーザーが選択した内容を返信します。

ユーザーのデバイスを確認したが、記憶されるように設定しなかった場合、Amazon Cognito は関連付けを保存しますが、デバイスキーを入力するとデバイス以外のサインインで続行します。デバイスは、ユーザーのセキュリティとトラブルシューティングに役立つログを生成できます。確認済みで記憶されていないデバイスは、サインイン機能を利用しませんが、セキュリティモニタリングログ機能は利用します。アプリクライアントの高度なセキュリティ機能を有効にし、デバイスのフットプリントをリクエストにエンコードすると、Amazon Cognito はユーザーイベントを確認済みのデバイスに関連付けます。

新しいデバイスキーを取得するには
  1. InitiateAuth API リクエストを使用してユーザーのサインインセッションを開始します。

  2. ユーザーのサインインセッションが完了したことをマークする JSON Web トークン (JWT) を受け取るまで、すべての認証チャレンジに RespondToAuthChallenge で応答します。

  3. アプリで、Amazon Cognito がその RespondToAuthChallenge または InitiateAuth レスポンスの NewDeviceMetadata に返す値 (DeviceGroupKey および DeviceKey) を記録します。

  4. ユーザー用の新しい SRP シークレット、つまりソルトおよびパスワード検証ツールを生成します。この関数は SRP ライブラリを提供する SDK で使用できます。

  5. ユーザーにデバイス名の入力を求めるか、ユーザーのデバイス特性からデバイス名を生成します。

  6. ConfirmDevice API リクエストでユーザーのアクセストークン、デバイスキー、デバイス名、SRP シークレットを指定します。ユーザープールがデバイスを [常に記憶する] に設定されていれば、ユーザー登録は完了です。

  7. Amazon Cognito が "UserConfirmationNecessary": trueConfirmDevice に応答した場合は、デバイスを記憶するかどうかを選択するようユーザーに促します。ユーザーがデバイスを記憶すると断言したら、ユーザーのアクセストークン、デバイスキー、および "DeviceRememberedStatus": "remembered" を使用して UpdateDeviceStatus API リクエストを生成します。

  8. Amazon Cognito にデバイスを記憶するように指示した場合、次回のサインイン時に MFA チャレンジの代わりに DEVICE_SRP_AUTH チャレンジが表示されます。

デバイスでのサインイン

ユーザーのデバイスを記憶するように設定すると、Amazon Cognito ではユーザーが同じデバイスキーでサインインするときに MFA コードを送信する必要がなくなります。デバイス認証は、MFA 認証チャレンジをデバイス認証チャレンジに置き換えるだけです。グループとしてサインインすることはできません。ユーザーはまずパスワードまたはカスタムチャレンジを使用して認証を完了する必要があります。記憶しているデバイスでのユーザーの認証プロセスは次のとおりです。

カスタム認証チャレンジ Lambda トリガーを使用するフローでデバイス認証を実行するには、InitiateAuth API リクエストで DEVICE_KEY パラメータを渡します。ユーザーがすべてのチャレンジに成功し、CUSTOM_CHALLENGE チャレンジが trueissueTokens 値を返すと、Amazon Cognito は最後の 1 つの DEVICE_SRP_AUTH チャレンジを返します。

デバイスでのサインインするには
  1. ユーザーのデバイスキーをクライアントストレージから取得します。

  2. InitiateAuth API リクエストを使用してユーザーのサインインセッションを開始します。USER_SRP_AUTHREFRESH_TOKEN_AUTHUSER_PASSWORD_AUTH、または CUSTOM_AUTHAuthFlow を選択します。AuthParameters で、ユーザーのデバイスキーを DEVICE_KEY パラメータに追加し、選択したログインフローに必要なその他のパラメータを含めます。

    1. 認証チャレンジへの PASSWORD_VERIFIER レスポンスのパラメータで DEVICE_KEY を渡すこともできます。

  3. レスポンスに DEVICE_SRP_AUTH チャレンジを受け取るまで、チャレンジレスポンスを完了します。

  4. RespondToAuthChallenge API リクエストで、DEVICE_SRP_AUTHChallengeNameUSERNAMEDEVICE_KEY、および SRP_A のパラメータを送信します。

  5. Amazon Cognito は DEVICE_PASSWORD_VERIFIER チャレンジで応答します。このチャレンジレスポンスには、SECRET_BLOCK および SRP_B の値が含まれます。

  6. SRP ライブラリを使用して PASSWORD_CLAIM_SIGNATUREPASSWORD_CLAIM_SECRET_BLOCKTIMESTAMPUSERNAMEDEVICE_KEY パラメータを生成して送信します。これらは追加の RespondToAuthChallenge リクエストで送信してください。

  7. ユーザーの JWT を受け取るまで、追加のチャレンジを完了してください。

次の擬似コードは、DEVICE_PASSWORD_VERIFIER チャレンジレスポンスの値を計算する方法を示しています。

PASSWORD_CLAIM_SECRET_BLOCK = SECRET_BLOCK TIMESTAMP = Tue Sep 25 00:09:40 UTC 2018 PASSWORD_CLAIM_SIGNATURE = Base64(SHA256_HMAC(K_USER, DeviceGroupKey + DeviceKey + PASSWORD_CLAIM_SECRET_BLOCK + TIMESTAMP)) K_USER = SHA256_HASH(S_USER) S_USER = (SRP_B - k * gx)(a + ux) x = SHA256_HASH(salt + FULL_PASSWORD) u = SHA256_HASH(SRP_A + SRP_B) k = SHA256_HASH(N + g)

デバイスの表示、更新、削除

Amazon Cognito API を使用して、アプリに次の機能を実装できます。

  1. ユーザーの現在のデバイスに関する情報を表示します。

  2. ユーザーのすべてのデバイスのリストを表示します。

  3. デバイスの「記憶済み」状態を解除する

  4. デバイスの記憶状態を更新します。

以下の説明の API リクエストを承認するアクセストークンには、aws.cognito.signin.user.admin スコープを含める必要があります。Amazon Cognito は、Amazon Cognito ユーザープール API を使用して生成するすべてのアクセストークンに、このスコープのクレームを追加します。サードパーティ IdP は、Amazon Cognito を認証するユーザーのデバイスと MFA を個別に管理する必要があります。ホストされた UI では aws.cognito.signin.user.admin スコープをリクエストできますが、ホストされた UI はデバイス情報を高度なセキュリティのユーザーログに自動的に追加するので、デバイスの記憶は提供しません。

デバイスに関する情報を表示する

ユーザーのデバイスに関する情報をクエリして、そのデバイスが現在も使用されているかどうかを判断できます。例えば、記憶されているデバイスが 90 日間サインインしていない場合に、そのデバイスを非アクティブ化することができます。

  • パブリッククライアントアプリにユーザーのデバイス情報を表示するには、ユーザーのアクセスキーとデバイスキーを GetDevice API リクエストで送信します。

  • 機密クライアントアプリにユーザーのデバイス情報を表示するには、AWS 認証情報を使用して AdminGetDevice API リクエストに署名し、ユーザーのユーザー名、デバイスキー、およびユーザープールを送信します。

ユーザーのすべてのデバイスのリストを表示する

ユーザーのすべてのデバイスとそのプロパティのリストを表示できます。例えば、現在のデバイスが記憶されているデバイスと一致することを検証することが可能です。

  • パブリッククライアントアプリでは、ListDevices API リクエストでユーザーのアクセストークンを送信します。

  • 機密クライアントアプリでは、AWS 認証情報を使用して AdminListDevices API リクエストに署名し、ユーザーのユーザー名とユーザープールを送信します。

デバイスの「記憶済み」状態を解除する

ユーザーのデバイスキーは削除できます。これは、ユーザーがデバイスを使用しなくなったと判断した場合や、異常なアクティビティを検出してユーザーに MFA を再度完了するように促す場合に役立ちます。デバイスを後で再登録するには、新しいデバイスキーを生成して保存する必要があります。

  • パブリッククライアントアプリでは、ForgetDevice API リクエストでユーザーのデバイスキーとアクセストークンを送信します。

  • 機密クライアントアプリでは、AdminForgetDevice API リクエストでユーザーのデバイスキーとアクセストークンを送信します。