应用程序中的高级安全数据收集 - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

应用程序中的高级安全数据收集

Amazon Cognito 自适应身份验证根据用户登录尝试的上下文详细信息评估账户盗用尝试的风险等级。您的应用程序必须向 API 请求添加上下文数据,这样 Amazon Cognito 高级安全才能更准确地评估风险。上下文数据是诸如 IP 地址、浏览器代理、设备信息和请求标头之类的信息,可提供有关用户如何连接到您的用户池的上下文信息。

向 Amazon Cognito 提交此上下文的应用程序的核心责任是向用户池发送身份验证请求中的一个EncodedData参数。要将这些数据添加到您的请求中,您可以使用软件开发工具包实现 Amazon Cognito,该软件开发工具包可以自动为您生成这些信息,也可以实现一个适用于 JavaScript iOS 或 Android 的模块来收集这些数据。直接向 Amazon Cognito 发出请求的@@ 仅限客户端的应用程序必须 Amazon Amplify 实现软件开发工具包。具有中间@@ 服务器或 API 组件的客户端服务器应用程序必须实现单独的 SDK 模块。

在以下情况下,您的身份验证前端无需任何其他配置即可管理用户上下文数据的收集:

  • 托管用户界面会自动收集上下文数据并将其提交给高级安全功能。

  • 所有 Amazon Amplify 库的身份验证方法中都内置了上下文数据集合。

使用 Amplify 在仅限客户端的应用程序中提交用户情境数据

Amplify 应用程序中高级安全功能的数据收集概述。

Amplify 软件开发工具包支持直接通过 Amazon Cognito 进行身份验证的移动客户端。此类客户直接向 Amazon Cognito 公共 API 操作发出 API 请求。默认情况下,Amplify 客户端会自动收集高级安全功能的上下文数据。

带的 Amplify 应用程序是个 JavaScript 例外。它们需要添加一个用于收集用户上下文数据的JavaScript 模块

通常,此配置中的应用程序使用未经身份验证的 API 操作,例如InitiateAuth和。RespondToAuthChallengeUserContextData对象有助于更准确地评估这些操作的风险。Amplify 软件开发工具包将设备和会话信息添加到的参数中。EncodedData UserContextData

在客户端-服务器应用程序中收集上下文数据

某些应用程序具有用于收集用户身份验证数据的前端层和用于向 Amazon Cognito 提交身份验证请求的应用程序后端层。这是由微服务支持的网络服务器和应用程序中的常见架构。在这些应用程序中,必须导入公共上下文数据集合库。

服务器端身份验证概述以及高级安全功能中的上下文数据。 JavaScript

通常,此配置中的应用程序服务器使用经过身份验证的 API 操作,例如AdminInitiateAuthAdminRespondToAuthChallenge。该ContextData对象可帮助 Amazon Cognito 更准确地评估这些操作的风险。的内容ContextData是您的前端传递给服务器的编码数据,以及用户对服务器的 HTTP 请求中的其他详细信息。这些额外的上下文详细信息(例如 HTTP 标头和 IP 地址)为您的应用程序服务器提供了用户环境的特征。

您的应用服务器也可能使用未经身份验证的 API 操作(如InitiateAuth和)进行登录。RespondToAuthChallengeUserContextData对象为这些操作中的高级安全风险分析提供信息。可用的公共上下文数据收集库中的操作将安全信息添加到身份验证请求中的EncodedData参数中。此外,将您的用户池配置为接受其他上下文数据,并将用户的源 IP 添加到的IpAddress参数中UserContextData

向客户端-服务器应用程序添加上下文数据
  1. 在您的前端应用程序中,使用 iO S、Android 或 JavaScript 模块从客户端收集经过编码的上下文数据。

  2. 将编码后的数据和身份验证请求的详细信息传递给您的应用程序服务器。

  3. 在您的应用程序服务器中,从 HTTP 请求中提取用户的 IP 地址、相关的 HTTP 标头、请求的服务器名称和请求的路径。将这些值填充到你向 Amazon Cognito 发出 API 请求的ContextData参数中。

  4. 使用您的 SDK 模块收集ContextData的已编码设备数据填充您的 API 请求中的EncodedData参数。将此上下文数据添加到身份验证请求中。

客户端-服务器应用程序的上下文数据库

JavaScript

amazon-cognito-advanced-security-data.min.js模块收集EncodedData了您可以传递给应用程序服务器的内容。

amazon-cognito-advanced-security-data.min.js模块添加到您的 JavaScript 配置中。<region>替换为以下 Amazon Web Services 区域 列表中的:us-east-1us-east-2us-west-2eu-west-1eu-west-2、或eu-central-1

<script src="https://amazon-cognito-assets.<region>.amazoncognito.com/amazon-cognito-advanced-security-data.min.js"></script>

要生成可在EncodedData参数中使用的encodedContextData对象,请将以下内容添加到您的 JavaScript 应用程序源中:

var encodedContextData = AmazonCognitoAdvancedSecurityData.getData(_username, _userpoolId, _userPoolClientId);

iOS/Swif

要生成情境数据,iOS 应用可以集成适用于 iO S 的移动 SDK 模块AWSCognitoIdentityProviderASF

要收集经过编码的上下文数据以提高安全性,请将以下代码段添加到您的应用程序中:

import AWSCognitoIdentityProviderASF let deviceId = getDeviceId() let encodedContextData = AWSCognitoIdentityProviderASF.userContextData( userPoolId, username: username, deviceId: deviceId, userPoolClientId: userPoolClientId) /** * Reuse DeviceId from keychain or generate one for the first time. */ func getDeviceId() -> String { let deviceIdKey = getKeyChainKey(namespace: userPoolId, key: "AWSCognitoAuthAsfDeviceId") if let existingDeviceId = self.keychain.string(forKey: deviceIdKey) { return existingDeviceId } let newDeviceId = UUID().uuidString self.keychain.setString(newDeviceId, forKey: deviceIdKey) return newDeviceId } /** * Get a namespaced keychain key given a namespace and key */ func getKeyChainKey(namespace: String, key: String) -> String { return "\(namespace).\(key)" }

Android

要生成上下文数据,安卓应用可以集成适用于安卓的移动 SDK 模块 aws-android-sdk-cognitoidentityprovider-asf

要收集经过编码的上下文数据以提高安全性,请将以下代码段添加到您的应用程序中:

UserContextDataProvider provider = UserContextDataProvider.getInstance(); // context here is android application context. String encodedContextData = provider.getEncodedContextData(context, username, userPoolId, userPoolClientId);