

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在應用程式中收集威脅防護的資料
<a name="user-pool-settings-viewing-threat-protection-app"></a>

Amazon Cognito [適應性身分驗證](cognito-user-pool-settings-adaptive-authentication.md)會從使用者登入嘗試的內容詳細資訊中，評估嘗試帳戶接管的風險等級。您的應用程式必須將*內容資料*新增至 API 請求，Amazon Cognito 威脅防護才能更準確地評估風險。內容資料是 IP 地址、瀏覽器代理程式、裝置資訊和請求標頭等資訊，提供使用者如何連接到使用者集區的相關內容資訊。

向 Amazon Cognito 提交此內容的應用程式的中心責任是對使用者集區的身分驗證請求中的`EncodedData`參數。若要將此資料新增至請求，您可以使用可自動產生此資訊的 SDK 來實作 Amazon Cognito，也可以實作用於 JavaScript、iOS 或 Android 的模組來收集此資料。直接向 Amazon Cognito 提出請求的*僅限用戶端*應用程式必須實作 AWS Amplify SDKs。具有中繼伺服器或 API 元件的*用戶端伺服器*應用程式必須實作個別的 SDK 模組。

在下列案例中，您的身分驗證前端會管理使用者內容資料收集，而不需要任何額外的組態：
+ 受管登入會自動收集內容資料並將其提交至威脅防護。
+ 所有 AWS Amplify 程式庫的身分驗證方法都內建內容資料收集。

## 使用 Amplify 在僅限用戶端應用程式中提交使用者內容資料
<a name="user-pool-settings-viewing-threat-protection-app-amplify"></a>

![Amplify 應用程式中威脅防護的資料收集概觀。](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/user-pools-asf-amplify-data-collection.png)


Amplify SDKs支援直接使用 Amazon Cognito 進行身分驗證的行動用戶端。這類用戶端會向 Amazon Cognito 公有 API 操作提出直接 API 請求。Amplify 用戶端預設會自動收集威脅防護的內容資料。

使用 JavaScript 來 Amplify 應用程式是例外狀況。它們需要新增 [JavaScript 模組](#user-pool-settings-viewing-threat-protection-app-additional-resources-js)來收集使用者內容資料。

一般而言，此組態中的應用程式會使用未經驗證的 API 操作，例如 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 和 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)。[UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_UserContextDataType.html) 物件有助於更準確地評估這些操作的風險。Amplify SDKs會將裝置和工作階段資訊新增至 的 `EncodedData`參數`UserContextData`。

## 在用戶端伺服器應用程式中收集內容資料
<a name="user-pool-settings-viewing-threat-protection-app-server-side"></a>

有些應用程式具有前端層，可收集使用者身分驗證資料，以及向 Amazon Cognito 提交身分驗證請求的應用程式後端層。這是微服務支援的 Web 伺服器和應用程式中常見的架構。在這些應用程式中，您必須匯入公有內容資料收集程式庫。

![JavaScript 中具有威脅防護內容資料的伺服器端身分驗證概觀 JavaScript 。](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/user-pools-asf-non-amplify-data-collection.png)


一般而言，此組態中的應用程式伺服器會使用已驗證的 API 操作，例如 [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html) 和 [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)。[ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ContextData) 物件可協助 Amazon Cognito 更準確地評估這些操作的風險。的內容`ContextData`是您的前端傳送到伺服器的編碼資料，以及來自使用者 HTTP 請求到伺服器的其他詳細資訊。這些額外的內容詳細資訊，例如 HTTP 標頭和 IP 地址，為您的應用程式伺服器提供使用者環境的特性。

您的應用程式伺服器也可能使用未經驗證的 API 操作登入，例如 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) 和 [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)。[UserContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html#CognitoUserPools-InitiateAuth-request-UserContextData) 物件會在這些操作中通知威脅防護風險分析。可用公有內容資料收集程式庫中的操作會將安全資訊新增至身分驗證請求中的 `EncodedData` 參數。此外，將您的使用者集區設定為接受其他內容資料，並將使用者的來源 IP 新增至 的 `IpAddress` 參數`UserContextData`。

**將內容資料新增至用戶端伺服器應用程式**

1. 在前端應用程式中，使用 [iOS、Android 或 JavaScript 模組](#user-pool-settings-viewing-threat-protection-app-additional-resources)從用戶端收集編碼的內容資料。

1. 將編碼的資料和身分驗證請求的詳細資訊傳遞給您的應用程式伺服器。

1. 在您的應用程式伺服器中，從 HTTP 請求擷取使用者的 IP 地址、相關的 HTTP 標頭、請求的伺服器名稱和請求的路徑。將這些值填入 Amazon Cognito API 請求的 [ContextData](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html#CognitoUserPools-AdminInitiateAuth-request-ContextData) 參數。

1. 使用 SDK 模組收集的編碼裝置資料填入 API 請求`ContextData`中的 `EncodedData` 參數。將此內容資料新增至身分驗證請求。

## 用戶端伺服器應用程式的內容資料程式庫
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources"></a>

### JavaScript
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-js"></a>

`amazon-cognito-advanced-security-data.min.js` 模組會收集您可以傳遞給應用程式伺服器的 `EncodedData` 。

將 `amazon-cognito-advanced-security-data.min.js` 模組新增至您的 JavaScript 組態。`<region>` 將 取代 AWS 區域 為下列清單中的 ：`us-east-1`、`us-east-2`、`eu-west-2`、、 `us-west-2` `eu-west-1`或 `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/Swift
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-ios"></a>

若要產生內容資料，iOS 應用程式可以整合[適用於 iOS 的 Mobile SDK](https://github.com/aws-amplify/aws-sdk-ios/tree/main) 模組 [AWSCognitoIdentityProviderASF](https://github.com/aws-amplify/aws-sdk-ios/tree/main/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
<a name="user-pool-settings-viewing-threat-protection-app-additional-resources-android"></a>

若要產生內容資料，Android 應用程式可以整合適用於 [Android 模組 aws-android-sdk-cognitoidentityprovider-asf 的 Mobile SDK](https://github.com/aws-amplify/aws-sdk-android/tree/main)。 [aws-android-sdk-cognitoidentityprovider-asf](https://github.com/aws-amplify/aws-sdk-android/tree/main/aws-android-sdk-cognitoidentityprovider-asf)

若要收集用於威脅防護的編碼內容資料，請將下列程式碼片段新增至您的應用程式：

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