身分集區身分驗證流程 - Amazon Cognito

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

身分集區身分驗證流程

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

外部供應商身分驗證流程

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

完成其中一個流程後,您可以存取角色的存取政策 AWS 服務 定義的其他流程。Amazon Cognito 主控台預設會建立可存取 Amazon Cognito Sync 存放區和 Amazon Mobile Analytics 的角色。如需有關如何授予其他存取權的詳細資訊,請參閱 IAM 角色

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

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

強化 (簡化) 身分驗證流程

當您使用增強型身分驗證流程時,您的應用程式會先在 GetId 請求中顯示來自授權 Amazon Cognito 使用者集區或第三方身分提供者的身分驗證證明。

  1. 您的應用程式會在 GetID 請求中提供來自授權 Amazon Cognito 使用者集區或第三方身分提供者的身分驗證證明,即 JSON Web 權杖或 SAML 聲明。

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

  3. 您的應用程式在 GetCredentialsForIdentity 請求中結合身分 ID 與相同的身分驗證證明。

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

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

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

增強型身分驗證中的操作順序
  1. GetId

  2. GetCredentialsForIdentity

顯示增強型身分驗證流程的圖表

基本 (傳統) 身分驗證流程

當您使用基本驗證流程時,

  1. 您的應用程式會在 GetID 請求中提供來自授權 Amazon Cognito 使用者集區或第三方身分提供者的身分驗證證明,例如 JSON Web 權杖或 SAML 聲明。

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

  3. 您的應用程式在 GetOpenIdToken 請求中結合身分 ID 與相同的身分驗證證明。

  4. GetOpenIdToken 會傳回身分集區發行的新 OAuth 2.0 權杖。

  5. 您的應用程式會在 AssumeRoleWithWebIdentity 請求中呈現新的權杖。

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

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

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

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

Basic (classic) flow is not supported with RoleMappings, please use enhanced flow.
基本身分驗證中的操作順序
  1. GetId

  2. GetOpenIdToken

  3. AssumeRoleWithWebIdentity

顯示基本身分驗證流程的圖表

開發人員驗證的身分驗證流程

使用 開發人員驗證的身分 時,用戶端使用包含 Amazon Cognito 外部程式碼的不同身分驗證流程,來驗證您自己身分驗證系統中的使用者。Amazon Cognito 外部程式碼就是指這個意思。

強化身分驗證流程

使用開發人員供應商進行增強型身分驗證的操作順序
  1. 透過開發人員供應商 (Amazon Cognito 外部程式碼) 登入

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

  3. GetOpenIdTokenForDeveloperIdentity

  4. GetCredentialsForIdentity

顯示開發人員驗證增強型身分驗證流程的圖表
使用開發人員供應商進行基本身分驗證的操作順序
  1. 在身分集區外部實作邏輯,以登入和產生開發人員提供者識別符。

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

  3. 在以授權 AWS 憑證簽署的 GetOpenIdTokenForDeveloperIdentity API 請求中傳送開發人員提供者識別符。

  4. 使用 AssumeRoleWithWebIdentity 請求應用程式憑證。

顯示開發人員驗證基本身分驗證流程的圖表

我應該使用哪一種身分驗證流程?

增強型流程是最安全的選擇,開發人員的工作量最低:

  • 增強的流程可減少 API 請求的複雜性、大小和速率。

  • 您的應用程式不需要向 提出其他 API 請求 AWS STS。

  • 您的身分集區會評估您的使用者應收到的 IAM 角色登入資料。您不需要在用戶端中嵌入角色選擇的邏輯。

重要

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

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

同樣地,請了解開發人員身分驗證是身分提供者身分驗證驗證的捷徑。Amazon Cognito AWS 信任授權 GetOpenIdTokenForDeveloperIdentity 請求的登入資料,而無需對請求內容進行其他驗證。保護授權開發人員身分驗證不被使用者存取的秘密。

API 摘要

GetId

GetId API 呼叫是在 Amazon Cognito 中建立新身分所需的第一個呼叫。

未驗證的存取

Amazon Cognito 可在您的應用程式中允許未驗證的訪客存取。如果在您的身分集區中啟用此功能,使用者就可以隨時透過 GetId API 來請求新的身分 ID。應用程式應該會快取此身分 ID 來對 Amazon Cognito 進行後續的呼叫。瀏覽器中的 AWS Mobile SDKs 和 AWS 適用於 JavaScript 的 SDK 具有可為您處理此快取的登入資料提供者。

已驗證的存取

如果您為應用程式設定公有登入供應商 (Facebook、Google+、Login with Amazon 或 Sign in with Apple) 的支援,使用者也可以提供在那些供應商中識別其身分的權杖 (OAuth 或 OpenID Connect)。在對 GetId 的呼叫中使用時,Amazon Cognito 會建立新的已驗證身分,或傳回已經與該特定登入建立關聯的身分。Amazon Cognito 執行此作業的方式,是向供應商驗證權杖,並確保下列事項:

  • 權杖有效,且是來自所設定的供應商。

  • 權杖未過期。

  • 權杖符合以該供應商 (例如,Facebook 應用程式 ID) 建立的應用程式識別符。

  • 權杖符合使用者識別符。

GetCredentialsForIdentity

建立身分 ID 後,即可呼叫 GetCredentialsForIdentity API。此操作在功能上等同於呼叫 GetOpenIdToken,然後呼叫 AssumeRoleWithWebIdentity

若要讓 Amazon Cognito 代表您來呼叫 AssumeRoleWithWebIdentity,您的身分集區必須要有與其相關聯的 IAM 角色。您可以透過 Amazon Cognito 主控台來執行,或是透過 SetIdentityPoolRoles 操作手動執行。

GetOpenIdToken

在您建立身分 ID 之後,提出 GetOpenIdToken API 請求。在您的第一個請求之後快取身分 ID,並使用 GetOpenIdToken 啟動該身分的後續基本 (傳統) 工作階段。

GetOpenIdToken API 請求的回應是 Amazon Cognito 產生的權杖。您可以提交此字符做為 AssumeRoleWithWebIdentity 請求中的WebIdentityToken參數。

在提交 OpenID 權杖之前,請先在您的應用程式中進行驗證。您可以在 SDK 或程式庫 (例如 aws-jwt-verify) 中使用 OIDC 程式庫,以確認 Amazon Cognito 已發行權杖。OpenID 權杖的簽署金鑰 ID (或 kid) 是 Amazon Cognito 身分 jwks_uri 文件† 中列出的項目之一。這些金鑰可能會有所變更。您用來驗證 Amazon Cognito 身分權杖的函數應該定期從 jwks_uri 文件更新其金鑰清單。Amazon Cognito 會在 jwks_uri 快取控制回應標頭中設定重新整理持續時間,目前將 max-age 設定為 30 天。

未驗證的存取

若要為未驗證的身分取得權杖,您只需要身分 ID 本身。針對已驗證的身分或您已停用的身分,無法取得未驗證的權杖。

已驗證的存取

如果您有已驗證的身分,您必須針對已經與該身分建立關聯的登入,傳遞至少一個有效的權杖。在 GetOpenIdToken 呼叫期間傳入的所有權杖,都必須通過前面提及的相同驗證;如果有任何權杖失敗,整個呼叫都會失敗。GetOpenIdToken 呼叫的回應也會包含身分 ID。這是因為您傳入的身分 ID 可能不是所傳回的身分 ID。

連結登入

如果針對尚未與任何身分建立關聯的登入提交權杖,該登入會被視為「連結」至相關聯的身分。一個公有供應商只能連結一個登入。如果嘗試將多個登入與一個公有供應商連結,會產生 ResourceConflictException 錯誤回應。如果登入只連結至現有的身分,GetOpenIdToken 傳回的身分 ID 會與傳入的身分 ID 相同。

合併身分

如果您針對目前未連結至指定身分,但已連結至另一個身分的登入傳入權杖,則兩個身分會合併。一旦合併,其中一個身分就會成為所有關聯登入的父項/擁有者,而另一個身分會停用。在這種情況下,會傳回父項/擁有者的身分 ID。如果此值不同,您必須更新本地快取。行動 SDKs 中的 AWS 提供者或瀏覽器中適用於 JavaScript 的 AWS SDK 會為您執行此操作。

GetOpenIdTokenForDeveloperIdentity

使用開發人員驗證身分時,GetOpenIdTokenForDeveloperIdentity 操作會從裝置取代 GetIdGetOpenIdToken 的使用。由於您的應用程式使用 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 或程式庫 (例如 aws-jwt-verify) 中使用 OIDC 程式庫,來確認 Amazon Cognito 已發行權杖。OpenID Connect 權杖的簽署金鑰 ID (kid) 是 Amazon Cognito 身分 jwks_uri 文件中列出的項目之一。這些金鑰可能會有所變更。您用來驗證 Amazon Cognito 身分權杖的函數應該定期從 jwks_uri 文件更新其金鑰清單。Amazon Cognito 會在 jwks_uri cache-control 回應標頭中設定重新整理持續時間,目前將 max-age 設定為 30 天。

連結登入

如同外部供應商,提供尚未與身分建立關聯的其他登入,將會隱含地將這些登入連結至該身分。如果您將外部供應商登入連結至某身分,使用者就可以透過該供應商來使用外部供應商身分驗證流程。但是在呼叫 GetIdGetOpenIdToken 時,無法在登入對應中使用您的開發人員供應商名稱。

合併身分

利用開發人員驗證的身分,Amazon Cognito 可以透過 MergeDeveloperIdentities API 來支援隱含合併及明確合併。透過明確合併,您可將系統中具有使用者識別符的兩個身分標記成單一身分。如果您提供來源和目標使用者識別符,Amazon Cognito 會將其合併。下次當您為其中任一使用者識別符來請求 OpenId Connect 權杖時,會傳回相同的身分 ID。

AssumeRoleWithWebIdentity

擁有 OpenID Connect 權杖之後,您可以透過對 AWS Security Token Service () 的 AssumeRoleWithWebIdentity API 請求,將此權杖轉換為臨時 AWS 憑證AWS STS。

由於沒有限制您可建立的身分數量,所以請務必了解您授予使用者的許可。為您的應用程式設定不同的 IAM 角色:一個用於未驗證的使用者,另一個用於已驗證的使用者。當您第一次設定身分集區時,Amazon Cognito 主控台可以建立預設角色。這些角色實際上沒有授予許可。修改它們以符合您的需求。

進一步了解 角色信任和許可

† 預設的 Amazon Cognito 身分 jwks_uri 文件包含在大部分 AWS 區域中為身分集區簽署權杖的金鑰相關資訊。下列區域有不同的 jwks_uri 文件。

Amazon Cognito Identity JSON web key URIs in other AWS 區域
AWS 區域 jwks_uri 文件的路徑
AWS GovCloud (US-West) https://cognito-identity.us-gov-west-1.amazonaws.com/.well-known/jwks_uri
China (Beijing) https://cognito-identity---cn-north-1.amazonaws.com.rproxy.goskope.com.cn/.well-known/jwks_uri
Opt-in Regions like Europe (Milan) and Africa (Cape Town) https://cognito-identity.Region.amazonaws.com/.well-known/jwks_uri

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