

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

# 获取凭证
<a name="getting-credentials"></a>

您可以使用 Amazon Cognito 为您的应用程序提供临时的、权限有限的证书，以便您的用户可以访问资源。 AWS 本部分介绍如何获取凭证以及如何从身份池检索 Amazon Cognito 身份。

Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。未经身份验证的用户的身份未经过验证，因此，该角色很适合您的应用程序的来宾用户或用户身份验证与否无关紧要的情形。经过身份验证的用户可以通过第三方身份提供商或证实其身份的用户池登录到您的应用程序。确保您的资源的权限范围适当，让未经身份验证的用户无权访问这些资源。

Amazon Cognito 身份并不是凭证。使用 AWS Security Token Service (AWS STS) 中的 Web 联合身份验证支持将它们交换为凭证。建议使用 `AWS.CognitoIdentityCredentials` 来为您的应用程序用户获得 AWS 凭证。然后使用将凭证对象中的身份交换为证书 AWS STS。

**注意**  
如果您的身份池是在 2015 年 2 月前创建的，则必须将角色与身份池重新关联，以便在没有角色作为参数的情况下使用 `AWS.CognitoIdentityCredentials` 构造函数。为此，请打开 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)，选择 **Manage identity pools**（管理身份池）、选择您的身份池，然后选择 **Edit identity Pool**（编辑身份池），指定您的经过身份验证的角色和未经身份验证的角色，然后保存更改。

Web 身份凭证提供者是中默认凭证提供者链的一部分。 AWS SDKs要在本地`config`文件中为 AWS SDK 或设置身份池令牌 AWS CLI，请添加`web_identity_token_file`个人资料条目。请参阅《工具参考指南》 AWS SDKs 和《工具参考指南》中的代入[角色凭证提供者](https://docs.aws.amazon.com/sdkref/latest/guide/feature-assume-role-credentials.html)。

要详细了解如何在 SDK 中填充 Web 身份凭证，请参阅《SDK 开发人员指南》。为了获得最佳效果，请使用内置的身份池集成开始您的项目 AWS Amplify。

**AWS 用于通过身份池获取和设置凭证的 SDK 资源**
+ 《Amplify 开发人员中心》的[身份池联合身份验证](https://docs.amplify.aws/lib/auth/advanced/q/platform/android/#identity-pool-federation)（Android）
+ 《Amplify 开发人员中心》的[身份池联合身份验证](https://docs.amplify.aws/lib/auth/advanced/q/platform/ios/#identity-pool-federation)（iOS）
+ 开发者指南中@@ [使用亚马逊 Cognito 身份对用户进行 适用于 JavaScript 的 AWS SDK 身份验证](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/loading-browser-credentials-cognito.html)
+ 开发者指南中的@@ [亚马逊 Cognito 凭证提供商](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html) 适用于 .NET 的 AWS SDK 
+ 在《 适用于 Go 的 AWS SDK 开发者指南》中@@ [以编程方式指定凭证](https://aws.github.io/aws-sdk-go-v2/docs/configuring-sdk/#specify-credentials-programmatically)
+ 在《 AWS SDK for Java 2.x 开发人员指南[》的代码中提供临时证书](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials-explicit.html)
+ [assumeRoleWithWebIdentityCredentialProvider](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials_provider.html#assume-role-with-web-identity-provider) 适用于 PHP 的 AWS SDK 开发者指南中的提供商
+  适用于 Python (Boto3) 的 AWS SDK 文档中的[代入 Web 身份提供者的角色](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html#assume-role-with-web-identity-provider)
+ 在 适用于 Rust 的 AWS SDK 开发者指南中@@ [指定您的凭证和默认区域](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/credentials.html)

以下各节提供了一些旧版的示例代码 AWS SDKs。

## Android
<a name="getting-credentials-1.android"></a>

您可以使用 Amazon Cognito 为您的应用程序提供临时的、权限有限的证书，以便您的用户可以访问资源。 AWS Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要为您的应用程序提供 AWS 凭证，请按照以下步骤操作。

要在安卓应用程序中使用 Amazon Cognito 身份池，请进行设置。 AWS Amplify有关更多信息，请参阅《Amplify 开发中心》**中的[身份验证](https://docs.amplify.aws/lib/auth/getting-started/q/platform/android/)。

**检索 Amazon Cognito 身份**

如果您允许未经身份验证的用户，则可以立即检索终端用户的唯一 Amazon Cognito 标识符（身份 ID）。如果您正在对用户进行身份验证，则可以在设置完凭证提供程序中的登录令牌后检索身份 ID：

```
String identityId = credentialsProvider.getIdentityId();
Log.d("LogTag", "my ID is " + identityId);
```

**注意**  
 请勿在应用程序的主线程中调用 `getIdentityId()`、`refresh()` 或 `getCredentials()`。从 Android 3.0（API 级别 11）开始，[NetworkOnMainThreadException](https://developer.android.com/reference/android/os/NetworkOnMainThreadException.html)如果您在主应用程序线程 I/O 上执行网络，您的应用程序将自动失败并抛出。您必须使用 `AsyncTask` 将您的代码移至后台线程。有关更多信息，请参阅 [Android 文档](https://developer.android.com/training/basics/network-ops/connecting.html#AsyncTask)。您也可以调用 `getCachedIdentityId()` 以检索 ID，但前提是已缓存在本地。否则，该方法将返回 null 值。

## iOS - Objective-C
<a name="getting-credentials-1.ios-objc"></a>

您可以使用 Amazon Cognito 为您的应用程序提供临时的、权限有限的证书，以便您的用户可以访问资源。 AWS Amazon Cognito 身份池同时支持经过身份验证和未经身份验证的身份。要为您的应用程序提供 AWS 凭证，请完成以下步骤。

要在 iOS 应用程序中使用 Amazon Cognito 身份池，请进行设置。 AWS Amplify有关更多信息，请参阅《Amplify 开发中心》**中的 [Swift 身份验证](https://docs.amplify.aws/lib/auth/getting-started/q/platform/ios/)和 [Flutter 身份验证](https://docs.amplify.aws/lib/auth/getting-started/q/platform/flutter/)。

**检索 Amazon Cognito 身份**

如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌（如果您正在对用户进行身份验证），则可以立即检索终端用户的唯一 Amazon Cognito 标识符（身份 ID）：

```
// Retrieve your Amazon Cognito ID
[[credentialsProvider getIdentityId] continueWithBlock:^id(AWSTask *task) {
    if (task.error) {
        NSLog(@"Error: %@", task.error);
    }
    else {
        // the task result will contain the identity id
        NSString *cognitoId = task.result;
    }
    return nil;
}];
```

**注意**  
 `getIdentityId` 为异步调用。如果您已在提供程序上设置身份 ID，则可以调用 `credentialsProvider.identityId` 以检索已缓存在本地的身份。但是，如果您未在提供程序上设置身份 ID，则调用 `credentialsProvider.identityId` 将返回 `nil`。有关更多信息，请参阅 [Amplify iOS SDK 参考](https://github.com/aws-amplify/aws-sdk-ios)。

## iOS - Swift
<a name="getting-credentials-1.ios-swift"></a>

您可以使用 Amazon Cognito 为您的应用程序提供临时的、有限权限的证书，以便您的用户可以访问资源。 AWS Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要为您的应用程序提供 AWS 凭证，请按照以下步骤操作。

要在 iOS 应用程序中使用 Amazon Cognito 身份池，请进行设置。 AWS Amplify有关更多信息，请参阅《Amplify 开发中心》**中的 [Swift 身份验证](https://docs.amplify.aws/lib/auth/getting-started/q/platform/ios/)。

**检索 Amazon Cognito 身份**

如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌（如果您正在对用户进行身份验证），则可以立即检索终端用户的唯一 Amazon Cognito 标识符（身份 ID）：

```
// Retrieve your Amazon Cognito ID
credentialsProvider.getIdentityId().continueWith(block: { (task) -> AnyObject? in
    if (task.error != nil) {
        print("Error: " + task.error!.localizedDescription)
    }
    else {
        // the task result will contain the identity id
        let cognitoId = task.result!
        print("Cognito id: \(cognitoId)")
    }
    return task;
})
```

**注意**  
 `getIdentityId` 为异步调用。如果您已在提供程序上设置身份 ID，则可以调用 `credentialsProvider.identityId` 以检索已缓存在本地的身份。但是，如果您未在提供程序上设置身份 ID，则调用 `credentialsProvider.identityId` 将返回 `nil`。有关更多信息，请参阅 [Amplify iOS SDK 参考](https://github.com/aws-amplify/aws-sdk-ios)。

## JavaScript
<a name="getting-credentials-1.javascript"></a>

如果您尚未创建身份池，则在使用 `AWS.CognitoIdentityCredentials` 之前，先在 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito)中创建一个身份池。

通过您的身份提供商配置身份池后，您可以使用 `AWS.CognitoIdentityCredentials` 验证用户身份。要将应用程序凭证配置为使用 `AWS.CognitoIdentityCredentials`，则为 `credentials` 或基于每个服务配置设置 `AWS.Config` 属性。以下示例使用 `AWS.Config`：

```
// Set the region where your identity pool exists (us-east-1, eu-west-1)
AWS.config.region = 'us-east-1';

// Configure the credentials provider to use your identity pool
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'IDENTITY_POOL_ID',
    Logins: { // optional tokens, used for authenticated login
        'graph.facebook.com': 'FBTOKEN',
        'www.amazon.com': 'AMAZONTOKEN',
        'accounts.google.com': 'GOOGLETOKEN',
        'appleid.apple.com': 'APPLETOKEN'
    }
});

// Make the call to obtain credentials
AWS.config.credentials.get(function(){

    // Credentials will be available when this function is called.
    var accessKeyId = AWS.config.credentials.accessKeyId;
    var secretAccessKey = AWS.config.credentials.secretAccessKey;
    var sessionToken = AWS.config.credentials.sessionToken;

});
```

可选的 `Logins` 属性是身份提供商名称到这些提供商身份令牌的映射。您如何从身份提供商获得令牌的方式取决于您使用的提供商。例如，如果 Facebook 是您的身份提供商之一，则您可以使用来自 [Facebook 软件开发工具包](https://developers.facebook.com/docs/facebook-login/web)的 `FB.login` 函数获取身份提供商令牌：

```
FB.login(function (response) {
    if (response.authResponse) { // logged in
        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
          IdentityPoolId: 'us-east-1:1699ebc0-7900-4099-b910-2df94f52a030',
          Logins: {
            'graph.facebook.com': response.authResponse.accessToken
          }
        });

        console.log('You are now logged in.');
    } else {
        console.log('There was a problem logging you in.');
    }
});
```

**检索 Amazon Cognito 身份**

如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌（如果您正在对用户进行身份验证），则可以立即检索终端用户的唯一 Amazon Cognito 标识符（身份 ID）：

```
var identityId = AWS.config.credentials.identityId;
```

## Unity
<a name="getting-credentials-1.unity"></a>

 您可以使用 Amazon Cognito 为您的应用程序提供临时的、权限有限的证书，以便您的用户可以访问资源。 AWS Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要为您的应用程序提供 AWS 凭证，请按照以下步骤操作。

[适用于 Unity 的AWS SDK](https://docs.aws.amazon.com/mobile/sdkforunity/developerguide/what-is-unity-plugin.html) 现在是 [适用于 .NET 的 SDK](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html) 的一部分。要开始使用中的亚马逊 Cognito 适用于 .NET 的 SDK，请参阅开发者指南中的[亚马逊 Cognito 凭证](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html)提供商。 适用于 .NET 的 AWS SDK 或者，请参阅 [Amplify 开发者中心](https://docs.amplify.aws/)，了解用于构建应用程序的选项。 AWS Amplify

**检索 Amazon Cognito 身份**

 如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌（如果您正在对用户进行身份验证），则可以立即检索终端用户的唯一 Amazon Cognito 标识符（身份 ID）：

```
credentials.GetIdentityIdAsync(delegate(AmazonCognitoIdentityResult<string> result) {
    if (result.Exception != null) {
        //Exception!
    }
    string identityId = result.Response;
});
```

## Xamarin
<a name="getting-credentials-1.xamarin"></a>

您可以使用 Amazon Cognito 为您的应用程序提供临时的、有限权限的证书，以便您的用户可以访问资源。 AWS Amazon Cognito 同时支持经过身份验证和未经身份验证的身份。要为您的应用程序提供 AWS 凭证，请按照以下步骤操作。

[适用于 Xamarin 的AWS SDK](https://docs.aws.amazon.com/mobile/sdkforxamarin/developerguide/Welcome.html) 现在是 [适用于 .NET 的 SDK](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html) 的一部分。要开始使用中的亚马逊 Cognito 适用于 .NET 的 SDK，请参阅开发者指南中的[亚马逊 Cognito 凭证](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html)提供商。 适用于 .NET 的 AWS SDK 或者，请参阅 [Amplify 开发者中心](https://docs.amplify.aws/)，了解用于构建应用程序的选项。 AWS Amplify

**注意**  
 **注意**：如果您在 2015 年 2 月之前创建了身份池，您必须将您的角色与身份池重新关联，才能在没有角色作为参数的情况下使用此构造函数。为此，请打开 [Amazon Cognito 控制台](https://console.aws.amazon.com/cognito/home)，选择 **Manage identity pools**（管理身份池）、选择您的身份池，然后选择 **Edit identity Pool**（编辑身份池），指定您的经过身份验证的角色和未经身份验证的角色，然后保存更改。

**检索 Amazon Cognito 身份**

 如果您允许未经身份验证的用户或者已设置完凭证提供程序中的登录令牌（如果您正在对用户进行身份验证），则可以立即检索终端用户的唯一 Amazon Cognito 标识符（身份 ID）：

```
var identityId = await credentials.GetIdentityIdAsync();
```