

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

# 取得憑證
<a name="getting-credentials"></a>

您可以使用 Amazon Cognito 將臨時、有限權限的登入資料交付到您的應用程式，以便您的使用者可以存取 AWS 資源。本節說明如何取得憑證，以及如何從身分集區擷取 Amazon Cognito 身分。

Amazon Cognito 可支援已驗證和未驗證的身分。未經授權的使用者的身分未經驗證，因此這個角色適用於您應用程式的訪客使用者，或使用者身分是否已驗證並不重要的情況。已驗證使用者透過第三方身分提供者或驗證其身分的使用者集區來登入應用程式。請務必適當地限制資源許可範圍，以避免從未經授權的使用者授與資源的存取權。

Amazon Cognito 身分不是憑證。在 AWS Security Token Service () 中使用 Web 聯合身分支援交換憑證AWS STS。若要您的應用程式使用者取得 AWS 憑證，建議的方法是使用 `AWS.CognitoIdentityCredentials`。然後，登入資料物件中的身分會使用 交換登入資料 AWS STS。

**注意**  
如果您在 2015 年 2 月之前建立身分池，您必須重新建立您的角色與身分池的關聯，以便使用 `AWS.CognitoIdentityCredentials` 建構函式，而無需將角色做為參數。若要執行此作業，請開啟 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)，選擇 **Manage identity pools** (管理身分集區)，選取您的身分集區，然後選擇 **Edit identity Pool** (編輯身分集區)，指定您的已驗證和未驗證角色，然後儲存變更。

Web 身分憑證提供者是 AWS SDK 中預設憑證提供者鏈結的一部分。若要在 SDK AWS 或 的本機`config`檔案中設定您的身分集區字符 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 使用身分集區取得和設定登入資料的開發套件資源**
+ 《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)
+ 《 適用於 JavaScript 的 AWS SDK 開發人員指南》中的[使用 Amazon Cognito Identity 驗證使用者](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/loading-browser-credentials-cognito.html) 
+ 《 適用於 .NET 的 AWS SDK 開發人員指南》中的 [Amazon Cognito 登入資料提供者](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html) 
+ 《 適用於 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)資料
+ 《 適用於 PHP 的 AWS SDK 開發人員指南》中的 [assumeRoleWithWebIdentityCredentialProvider](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials_provider.html#assume-role-with-web-identity-provider) 提供者
+ 在 適用於 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 登入資料給應用程式，請依照下列步驟進行。

若要在 Android 應用程式中使用 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) 開始，如果您在主要應用程式執行緒上執行網路 I/O，您的應用程式將會自動失敗，並擲出 [NetworkOnMainThreadException](https://developer.android.com/reference/android/os/NetworkOnMainThreadException.html)。您需要使用 `AsyncTask` 將您的程式碼移到背景執行緒。如需詳細資訊，請參閱 [Android documentation](https://developer.android.com/training/basics/network-ops/connecting.html#AsyncTask)。您也可以呼叫 `getCachedIdentityId()`來擷取 ID，但前提是已在本機快取過 ID。否則，此方法會傳回空值。

## 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)，或者如果您要驗證使用者，可以在憑證供應商中設定登入權杖之後，擷取身分 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)，或者如果您要驗證使用者，可以在憑證供應商中設定登入權杖之後，擷取身分 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>

如果您尚未建立身分集區，請在 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito)中建立身分集區，然後再使用 `AWS.CognitoIdentityCredentials`。

在您以您的身分提供者設定身分集區之後，您可以使用 `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 是您的身分提供者之一，您可以使用 `FB.login`Facebook 開發套件[的 ](https://developers.facebook.com/docs/facebook-login/web) 函數來取得身分提供者權杖：

```
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)，或者如果您要驗證使用者，可以在憑證供應商中設定登入權杖之後，擷取身分 ID：

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

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

 您可以使用 Amazon Cognito 將臨時、有限權限的登入資料交付到您的應用程式，以便您的使用者可以存取 AWS 資源。Amazon Cognito 可支援已驗證和未驗證的身分。若要提供 AWS 登入資料給應用程式，請依照下列步驟進行。

[AWS SDK for Unity](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) 的一部分。若要在 中開始使用 Amazon Cognito 適用於 .NET 的 SDK，請參閱《 適用於 .NET 的 AWS SDK 開發人員指南》中的 [Amazon Cognito 登入資料提供者](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html)。或者，請參閱 [Amplify 開發中心](https://docs.amplify.aws/)，了解使用 建置應用程式的選項 AWS Amplify。

**擷取 Amazon Cognito 身分**

 如果您要允許未驗證的使用者，可以立即為您的最終使用者擷取唯一 Amazon Cognito 識別符 (身分 ID)，或者如果您要驗證使用者，可以在憑證供應商中設定登入權杖之後，擷取身分 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 登入資料給應用程式，請依照下列步驟進行。

[AWS SDK for Xamarin](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) 的一部分。若要在 中開始使用 Amazon Cognito 適用於 .NET 的 SDK，請參閱《 適用於 .NET 的 AWS SDK 開發人員指南》中的 [Amazon Cognito 登入資料提供者](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/cognito-creds-provider.html)。或者，請參閱 [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)，或者如果您要驗證使用者，可以在憑證供應商中設定登入權杖之後，擷取身分 ID：

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