

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

# 身分集區身分驗證流程
<a name="authentication-flow"></a>

Amazon Cognito 可協助您為最終使用者建立唯一識別符，以在各種裝置和平台之間保持一致性。Amazon Cognito 也會為您的應用程式提供暫時、有限權限的登入資料，以存取 AWS 資源。本頁面涵蓋身分驗證在 Amazon Cognito 中的運作方式基本概念，並說明身分在身分集區中的生命週期。

**外部供應商身分驗證流程**

向 Amazon Cognito 驗證的使用者會進行多步驟的程序來自舉其憑證。Amazon Cognito 有兩種向公有供應商進行身分驗證的不同流程：強化和基本。

完成其中一個流程後，您就可以存取角色的存取政策 AWS 服務 所定義的其他流程。[Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/)預設會建立可存取 Amazon Cognito Sync 存放區和 Amazon Mobile Analytics 的角色。如需有關如何授予其他存取權的詳細資訊，請參閱 [IAM 角色](iam-roles.md)。

身分集區接受提供者的下列成品：


| 供應商 | 身分驗證成品 | 
| --- | --- | 
| Amazon Cognito 使用者集區 | ID 權杖 | 
| OpenID Connect (OIDC) | ID 權杖 | 
| SAML 2.0 | SAML 聲明 | 
| 社交供應商 | 存取權杖 | 

## 增強型 （簡化） 身分驗證流程
<a name="authentication-flow-enhanced"></a>

當您使用增強型身分驗證流程時，您的應用程式會先在 [GetId](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) 請求中提供授權 Amazon Cognito 使用者集區或第三方身分提供者的身分驗證證明。

1. 您的應用程式會在 [GetID](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) 請求中提供來自授權 Amazon Cognito 使用者集區或第三方身分提供者的身分驗證證明 – JSON Web 權杖或 SAML 聲明。

1. 您的身分集區會傳回身分 ID。

1. 您的應用程式在 [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html) 請求中結合了身分 ID 與相同的身分驗證證明。

1. 您的身分集區會傳回 AWS 登入資料。

1. 您的應用程式使用暫時登入資料簽署 AWS API 請求。

增強型身分驗證可管理身分集區組態中 IAM 角色選取和憑證擷取的邏輯。您可以設定身分集區以選取預設角色，將屬性型存取控制 (ABAC) 或角色型存取控制 (RBAC) 原則套用至角色選取。增強型身分驗證的 AWS 登入資料有效期為一小時。

**增強型身分驗證中的操作順序**

1. `GetId`

1. `GetCredentialsForIdentity`

![\[顯示增強型身分驗證流程的圖表\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/amazon-cognito-ext-auth-enhanced-flow.png)


## 基本 （傳統） 身分驗證流程
<a name="authentication-flow-basic"></a>

當您實作基本身分驗證流程時，您的應用程式會選取您希望使用者擔任的 IAM 角色。

1. 您的應用程式會在 [GetID](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) 請求中提供來自授權 Amazon Cognito 使用者集區或第三方身分提供者的身分驗證證明 – JSON Web 權杖或 SAML 聲明。

1. 您的身分集區會傳回身分 ID。

1. 您的應用程式在 [GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html) 請求中結合了身分 ID 與相同的身分驗證證明。

1. `GetOpenIdToken` 會傳回身分集區發行的新 OAuth 2.0 字符。

1. 您的應用程式會在 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 請求中顯示新的權杖。

1. AWS Security Token Service (AWS STS) 會傳回 AWS 登入資料。

1. 您的應用程式使用暫時登入資料簽署 AWS API 請求。

基本工作流程可讓您更精密控制自己分配給使用者的憑證。強化身分驗證流程的 `GetCredentialsForIdentity` 請求會根據存取權杖的內容請求角色。傳統工作流程中的`AssumeRoleWithWebIdentity`請求會授予您的應用程式更大的能力，以針對您已設定足夠信任政策的任何 AWS Identity and Access Management 角色請求登入資料。您也可以請求自訂角色工作階段持續時間。

您可以在沒有角色映射的使用者集區中使用基本身分驗證流程登入。這種類型的身分集區沒有預設驗證或未驗證的角色，也沒有設定角色型或屬性型存取控制。當您`GetOpenIdToken`嘗試使用角色映射的身分集區時，您會收到下列錯誤。

```
Basic (classic) flow is not supported with RoleMappings, please use enhanced flow.
```

**基本身分驗證中的操作順序**

1. `GetId`

1. `GetOpenIdToken`

1. `AssumeRoleWithWebIdentity`

![\[顯示基本身分驗證流程的圖表\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/amazon-cognito-ext-auth-basic-flow.png)


## 開發人員驗證的身分驗證流程
<a name="authentication-flow-developer"></a>

使用 時[開發人員驗證的身分](developer-authenticated-identities.md)，您的用戶端會使用不同的身分驗證流程，其中包含 Amazon Cognito 外部的程式碼，以驗證您自己的身分驗證系統中的使用者。從身分集區的觀點來看，您在身分請求中提出的宣告是任意識別符，而身分驗證是由您在應用程式中編碼的 IAM 憑證授權。

**使用開發人員供應商的增強型身分驗證中的操作順序**

1. 透過開發人員供應商 (Amazon Cognito 外部程式碼) 登入

1. 驗證使用者登入 (Amazon Cognito 外部程式碼)

1. [GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html)

1. [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html)

![\[顯示開發人員驗證增強型身分驗證流程的圖表\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/amazon-cognito-dev-auth-enhanced-flow.png)


**與開發人員供應商進行基本身分驗證的操作順序**

1. 實作身分集區外部的邏輯，以登入並產生開發人員提供者識別符。

1. 擷取儲存的伺服器端 AWS 登入資料。

1. 在以授權 AWS 憑證簽署的 [GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) API 請求中傳送開發人員提供者識別符。

1. 使用 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 請求應用程式登入資料。

![\[顯示開發人員驗證基本身分驗證流程的圖表\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/amazon-cognito-dev-auth-basic-flow.png)


## 我應該實作哪個身分驗證流程？
<a name="authentication-flow-choosing"></a>

**增強型流程**是開發人員工作量最低的最安全選擇：
+ 增強的流程可減少 API 請求的複雜性、大小和速率。
+ 您的應用程式不需要向 提出其他 API 請求 AWS STS。
+ 您的身分集區會評估使用者應收到的 IAM 角色登入資料。您不需要在用戶端中嵌入角色選擇的邏輯。

**重要**  
當您建立新的身分集區時，預設不要啟用基本 （傳統） 身分驗證，這是最佳實務。若要實作基本身分驗證，請先評估 Web 身分 IAM 角色的信任關係。然後在您的用戶端中建置角色選取的邏輯，並保護用戶端不受使用者修改。

**基本身分驗證流程**會將 IAM 角色選擇的邏輯委派給您的應用程式。在此流程中，Amazon Cognito 會驗證使用者的已驗證或未驗證的工作階段，並發出權杖供您交換登入資料 AWS STS。使用者可以將來自基本身分驗證的字符交換為信任您的身分集區和 的任何 IAM 角色`amr`，或已驗證/未驗證狀態。

同樣地，請了解**開發人員身分驗證**是身分提供者身分驗證驗證的捷徑。Amazon Cognito AWS 信任授權 [GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) 請求的登入資料，無需對請求內容進行其他驗證。保護授權開發人員身分驗證不被使用者存取的秘密。

## 身分驗證流程 API 操作概觀
<a name="authentication-flow-operations"></a>

**GetId**  
[GetId](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) API 呼叫是在 Amazon Cognito 中建立新身分所需的第一個呼叫。    
未驗證的存取  
Amazon Cognito 可在您的應用程式中允許未驗證的訪客存取。如果在您的身分集區中啟用此功能，使用者就可以隨時透過 `GetId` API 來請求新的身分 ID。應用程式應該會快取此身分 ID 來對 Amazon Cognito 進行後續的呼叫。瀏覽器中的 AWS Mobile SDKs 和適用於 JavaScript 的 AWS SDK 具有可為您處理此快取的登入資料提供者。  
已驗證的存取  
如果您為應用程式設定公有登入供應商 (Facebook、Google\$1、Login with Amazon 或 Sign in with Apple) 的支援，使用者也可以提供在那些供應商中識別其身分的權杖 (OAuth 或 OpenID Connect)。在對 `GetId` 的呼叫中使用時，Amazon Cognito 會建立新的已驗證身分，或傳回已經與該特定登入建立關聯的身分。Amazon Cognito 執行此作業的方式，是向供應商驗證權杖，並確保下列事項：  
+ 權杖有效，且是來自所設定的供應商。
+ 權杖未過期。
+ 權杖符合以該供應商 (例如，Facebook 應用程式 ID) 建立的應用程式識別符。
+ 權杖符合使用者識別符。

**GetCredentialsForIdentity**  
建立身分 ID 後，即可呼叫 [GetCredentialsForIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html) API。此操作在功能上等同於呼叫 [GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html)，然後呼叫 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)。  
若要讓 Amazon Cognito 代表您來呼叫 `AssumeRoleWithWebIdentity`，您的身分集區必須要有與其相關聯的 IAM 角色。您可以透過 Amazon Cognito 主控台來執行，或是透過 [SetIdentityPoolRoles](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_SetIdentityPoolRoles.html) 操作手動執行。

**GetOpenIdToken**  
在您建立身分 ID 之後，提出 [GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html) API 請求。在您的第一個請求之後快取身分 ID，並使用 `GetOpenIdToken` 啟動該身分的後續基本 (傳統) 工作階段。  
對 `GetOpenIdToken` API 請求的回應是 Amazon Cognito 產生的權杖。您可以提交此字符做為 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 請求中的`WebIdentityToken`參數。  
在提交 OpenID 權杖之前，請先在您的應用程式中進行驗證。您可以在 SDK 或程式庫 (例如 [https://github.com/awslabs/aws-jwt-verify](https://github.com/awslabs/aws-jwt-verify)) 中使用 OIDC 程式庫，以確認 Amazon Cognito 已發行權杖。OpenID 權杖的簽署金鑰 ID (或 `kid`) 是 Amazon Cognito 身分 [jwks\$1uri 文件](https://cognito-identity.amazonaws.com/.well-known/jwks_uri)† 中列出的項目之一。這些金鑰可能會有所變更。您用來驗證 Amazon Cognito 身分權杖的函數應該定期從 *jwks\$1uri* 文件更新其金鑰清單。Amazon Cognito 會在 *jwks\$1uri* 快取控制回應標頭中設定重新整理持續時間，目前將 `max-age` 設定為 30 天。    
未驗證的存取  
若要為未驗證的身分取得權杖，您只需要身分 ID 本身。針對已驗證的身分或您已停用的身分，無法取得未驗證的權杖。  
已驗證的存取  
如果您有已驗證的身分，您必須針對已經與該身分建立關聯的登入，傳遞至少一個有效的權杖。在 `GetOpenIdToken` 呼叫期間傳入的所有權杖，都必須通過前面提及的相同驗證；如果有任何權杖失敗，整個呼叫都會失敗。`GetOpenIdToken` 呼叫的回應也會包含身分 ID。這是因為您傳入的身分 ID 可能不是所傳回的身分 ID。  
連結登入  
如果針對尚未與任何身分建立關聯的登入提交權杖，該登入會被視為「連結」至相關聯的身分。一個公有供應商只能連結一個登入。如果嘗試將多個登入與一個公有供應商連結，會產生 `ResourceConflictException` 錯誤回應。如果登入只連結至現有的身分，`GetOpenIdToken` 傳回的身分 ID 會與傳入的身分 ID 相同。  
合併身分  
如果您針對目前未連結至指定身分，但已連結至另一個身分的登入傳入權杖，則兩個身分會合併。一旦合併，其中一個身分就會成為所有關聯登入的父項/擁有者，而另一個身分會停用。在這種情況下，會傳回父項/擁有者的身分 ID。如果此值不同，您必須更新本地快取。Mobile AWS SDKs中的提供者或瀏覽器中適用於 JavaScript 的 AWS SDK 會為您執行此操作。

**GetOpenIdTokenForDeveloperIdentity**  
使用開發人員驗證的身分時，[GetOpenIdTokenForDeveloperIdentity](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdTokenForDeveloperIdentity.html) 操作會從裝置取代 [GetId](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html) 和 [GetOpenIdToken](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetOpenIdToken.html) 的使用。由於您的應用程式使用 AWS 登入資料簽署此 API 操作的請求，Amazon Cognito 信任請求中提供的使用者識別符是有效的。開發人員身分驗證會取代 Amazon Cognito 對外部供應商執行的字符驗證。  
此 API 的承載包含`logins`映射。此映射必須包含開發人員供應商的金鑰，以及做為系統中使用者識別符的值。如果使用者識別符尚未連結至現有的身分，Amazon Cognito 會建立一個新的身分，並傳回新的身分 ID，以及該身分的 OpenID Connect 權杖。如果使用者識別符已經連結，Amazon Cognito 會傳回既有的身分 ID 和 OpenID Connect 權杖。在您的第一個請求之後快取開發人員身分 ID，並使用 `GetOpenIdTokenForDeveloperIdentity` 啟動該身分的後續基本 (傳統) 工作階段。  
對 `GetOpenIdTokenForDeveloperIdentity` API 請求的回應是 Amazon Cognito 產生的權杖。您可以在 `AssumeRoleWithWebIdentity` 請求中提交此權杖作為 `WebIdentityToken` 參數。  
在提交 OpenID Connect 權杖之前，請先在您的應用程式中進行驗證。您可以在 SDK 或程式庫 (例如 [https://github.com/awslabs/aws-jwt-verify](https://github.com/awslabs/aws-jwt-verify)) 中使用 OIDC 程式庫，來確認 Amazon Cognito 已發行權杖。OpenID Connect 權杖的簽署金鑰 ID (`kid`) 是 Amazon Cognito 身分 [*jwks\$1uri* 文件](https://cognito-identity.amazonaws.com/.well-known/jwks_uri)中列出的項目之一。這些金鑰可能會有所變更。您用來驗證 Amazon Cognito 身分權杖的函數應該定期從 *jwks\$1uri* 文件更新其金鑰清單。Amazon Cognito 會在 *jwks\$1uri* `cache-control` 回應標頭中設定重新整理持續時間，目前將 `max-age` 設定為 30 天。    
連結登入  
如同外部供應商，提供尚未與身分建立關聯的其他登入，將會隱含地將這些登入連結至該身分。如果您將外部供應商登入連結至某身分，使用者就可以透過該供應商來使用外部供應商身分驗證流程。但是在呼叫 `GetId` 或 `GetOpenIdToken` 時，無法在登入對應中使用您的開發人員供應商名稱。  
合併身分  
利用開發人員驗證的身分，Amazon Cognito 可以透過 [MergeDeveloperIdentities](https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_MergeDeveloperIdentities.html) API 來支援隱含合併及明確合併。透過明確合併，您可將系統中具有使用者識別符的兩個身分標記成單一身分。如果您提供來源和目標使用者識別符，Amazon Cognito 會將其合併。下次當您為其中任一使用者識別符來請求 OpenId Connect 權杖時，會傳回相同的身分 ID。

**AssumeRoleWithWebIdentity**  
擁有 OpenID Connect 權杖後，您可以透過對 AWS Security Token Service () 的 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 請求，將此權杖交換為臨時 AWS 憑證AWS STS。  
由於沒有限制您可建立的身分數量，所以請務必了解您授予使用者的許可。為您的應用程式設定不同的 IAM 角色：一個用於未驗證的使用者，另一個用於已驗證的使用者。當您第一次設定身分集區時，Amazon Cognito 主控台可以建立預設角色。這些角色實際上沒有授予許可。修改它們以符合您的需求。  
進一步了解 [角色信任和許可](iam-roles.md#role-trust-and-permissions)。

† 預設的 Amazon Cognito 身分 [https://cognito-identity.amazonaws.com/.well-known/jwks_uri](https://cognito-identity.amazonaws.com/.well-known/jwks_uri) 文件包含在大部分 AWS 區域中為身分集區簽署權杖的金鑰相關資訊。下列區域有不同的 *jwks\$1uri* 文件。


| AWS 區域 | *jwks\$1uri* 文件的路徑 | 
| --- |--- |
| AWS GovCloud (US-West) | https://cognito-identity.us-gov-west-1.amazonaws.com/.well-known/jwks\$1uri | 
| China (Beijing) | https://cognito-identity---cn-north-1.amazonaws.com.rproxy.goskope.com.cn/.well-known/jwks\$1uri | 
| Opt-in Regions like Europe (Milan) and Africa (Cape Town) | https://cognito-identity.Region.amazonaws.com/.well-known/jwks\$1uri | 

您也可以推斷來自發行者的 *jwks\$1uri* 或您在 Amazon Cognito 的 OpenID 權杖收到的 `iss`。OIDC 標準探索端點 `<issuer>/.well-known/openid-configuration` 會列出權杖之 *jwks\$1uri* 的路徑。