本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
身分集區身分驗證流程
Amazon Cognito 可協助您為最終使用者建立唯一識別符,以在各種裝置和平台之間保持一致性。Amazon Cognito 也會將臨時、有限權限的登入資料提供給應用程式,以存取 AWS 資源。本頁面涵蓋身分驗證在 Amazon Cognito 中的運作方式基本概念,並說明身分在身分集區中的生命週期。
外部供應商身分驗證流程
向 Amazon Cognito 驗證的使用者會進行多步驟的程序來自舉其憑證。Amazon Cognito 有兩種向公有供應商進行身分驗證的不同流程:強化和基本。
完成其中一個流程後,您可以存取角色的存取政策 AWS 服務 定義的其他流程。Amazon Cognito 主控台
身分集區接受提供者的下列成品:
供應商 | 驗證成品 |
---|---|
Amazon Cognito 使用者集區 | ID 權杖 |
OpenID Connect (OIDC) | ID 權杖 |
SAML 2.0 | SAML 聲明 |
社交供應商 | 存取權杖 |
強化 (簡化) 身分驗證流程
當您使用增強型身分驗證流程時,您的應用程式會先在 GetId 請求中顯示來自授權 Amazon Cognito 使用者集區或第三方身分提供者的身分驗證證明。
-
您的應用程式會在 GetID 請求中提供來自授權 Amazon Cognito 使用者集區或第三方身分提供者的身分驗證證明,即 JSON Web 權杖或 SAML 聲明。
-
您的身分集區會傳回身分 ID。
-
您的應用程式在 GetCredentialsForIdentity 請求中結合身分 ID 與相同的身分驗證證明。
-
您的身分集區會傳回 AWS 登入資料。
-
您的應用程式使用暫時登入資料簽署 AWS API 請求。
增強型身分驗證可管理身分集區組態中 IAM 角色選取和憑證擷取的邏輯。您可以設定身分集區以選取預設角色,將屬性型存取控制 (ABAC) 或角色型存取控制 (RBAC) 原則套用至角色選取。增強型身分驗證的 AWS 登入資料有效期為一小時。
增強型身分驗證中的操作順序
-
GetId
-
GetCredentialsForIdentity

基本 (傳統) 身分驗證流程
當您使用基本驗證流程時,
-
您的應用程式會在 GetID 請求中提供來自授權 Amazon Cognito 使用者集區或第三方身分提供者的身分驗證證明,例如 JSON Web 權杖或 SAML 聲明。
-
您的身分集區會傳回身分 ID。
-
您的應用程式在 GetOpenIdToken 請求中結合身分 ID 與相同的身分驗證證明。
-
GetOpenIdToken
會傳回身分集區發行的新 OAuth 2.0 權杖。 -
您的應用程式會在 AssumeRoleWithWebIdentity 請求中呈現新的權杖。
-
AWS Security Token Service (AWS STS) 會傳回 AWS 登入資料。
-
您的應用程式使用暫時登入資料簽署 AWS API 請求。
基本工作流程可讓您更精密控制自己分配給使用者的憑證。強化身分驗證流程的 GetCredentialsForIdentity
請求會根據存取權杖的內容請求角色。傳統工作流程中的AssumeRoleWithWebIdentity
請求,可讓您的應用程式更能夠為您已設定足夠信任政策的任何 AWS Identity and Access Management 角色請求登入資料。您也可以請求自訂角色工作階段持續時間。
您可以在沒有角色映射的使用者集區中使用基本驗證流程登入。這種類型的身分集區沒有預設的身分驗證或未驗證的角色,也沒有設定角色型或屬性型存取控制。當您嘗試使用角色映射在身分集區GetOpenIdToken
中時,您會收到下列錯誤。
Basic (classic) flow is not supported with RoleMappings, please use enhanced flow.
基本身分驗證中的操作順序
-
GetId
-
GetOpenIdToken
-
AssumeRoleWithWebIdentity

開發人員驗證的身分驗證流程
使用 開發人員驗證的身分 時,用戶端使用包含 Amazon Cognito 外部程式碼的不同身分驗證流程,來驗證您自己身分驗證系統中的使用者。Amazon Cognito 外部程式碼就是指這個意思。
強化身分驗證流程
使用開發人員供應商進行增強型身分驗證的操作順序
-
透過開發人員供應商 (Amazon Cognito 外部程式碼) 登入
-
驗證使用者登入 (Amazon Cognito 外部程式碼)

使用開發人員供應商進行基本身分驗證的操作順序
-
在身分集區外部實作邏輯,以登入和產生開發人員提供者識別符。
-
擷取儲存的伺服器端 AWS 登入資料。
-
在以授權 AWS 憑證簽署的 GetOpenIdTokenForDeveloperIdentity API 請求中傳送開發人員提供者識別符。
-
使用 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 操作會從裝置取代 GetId 和 GetOpenIdToken 的使用。由於您的應用程式使用 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 天。- 連結登入
-
如同外部供應商,提供尚未與身分建立關聯的其他登入,將會隱含地將這些登入連結至該身分。如果您將外部供應商登入連結至某身分,使用者就可以透過該供應商來使用外部供應商身分驗證流程。但是在呼叫
GetId
或GetOpenIdToken
時,無法在登入對應中使用您的開發人員供應商名稱。 - 合併身分
-
利用開發人員驗證的身分,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 文件的路徑 |
---|---|
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. |
您也可以推斷來自發行者的 jwks_uri 或您在 Amazon Cognito 的 OpenID 權杖收到的 iss
。OIDC 標準探索端點 <issuer>/.well-known/openid-configuration
會列出權杖之 jwks_uri 的路徑。