將 OIDC 提供者設定為識別集區 IdP - Amazon Cognito

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

將 OIDC 提供者設定為識別集區 IdP

OpenID Connect 是一種用來進行身分驗證的開放標準,許多登入供應商皆支援。Amazon Cognito 支援使用透過 AWS Identity and Access Management 設定的 OpenID Connect 供應商來連結身分。

新增 OpenID Connect 供應商

如需有關如何建立 OpenID Connect 供應商的詳細資訊,請參閱《AWS Identity and Access Management使用者指南》中的建立 OpenID Connect (OIDC) 身分提供者

將供應商與 Amazon Cognito 相關聯

若要新增 OIDC 身分提供者 (IdP)
  1. Amazon Cognito 主控台選擇 身分池。選取身分池。

  2. 選擇 使用者存取權 索引標籤。

  3. 選取 新增身分供應商

  4. 選擇 OpenID Connect (OIDC)

  5. 從您的. IdPs 中的 IAM 選擇 OIDC 身分識別提供者。AWS 帳戶如果要新增新的 SAML 提供者,請選擇 建立新的提供者 以前往 IAM 主控台。

  6. 若要設定 Amazon Cognito 向已通過此提供者進行身分驗證的使用者發布憑證時的角色,請設定 角色設定

    1. 您可以為該 IdP 使用者指派設定 已驗證角色 時的 預設角色,或您可以 選擇具有規則的角色

      1. 如果您選擇 使用規則選擇角色,請輸入使用者身分驗證的 宣告 來源、比較宣告的 操作員、導致符合角色選擇的 ,以及當符合 角色指派 時您要指派的 角色。選取 新增另一項 以根據不同的條件建立其他規則。

      2. 選擇 角色解析。當您的使用者宣告與您的規則不符時,您可以拒絕憑證或向 已驗證角色 發出憑證。

  7. 若要變更透過此提供者驗證使用者,Amazon Cognito 發布憑證時指派的主要索引標籤,請設定 存取控制的屬性

    1. 若不套用主要索引標籤,請選擇 非作用中

    2. 若要根據 subaud 宣告套用主要索引標籤,請選擇 使用預設對應

    3. 若要建立您自己的自訂屬性結構描述至主要索引標籤,請選擇 使用自訂對應。然後,輸入您要從每個 宣告 中獲取的 標籤金鑰,顯示於索引標籤當中。

  8. 選取儲存變更

您可以將多個 OpenID Connect 供應商與單一身分集區相關聯。

使用 OpenID Connect

請參閱供應商的說明文件,以了解如何登入及接收 ID 權杖。

在您擁有權杖後,將該權杖新增至登入對映。使用供應商的 URI 作為金鑰。

驗證 OpenID Connect 權杖

第一次與 Amazon Cognito 整合時,您可能會收到 InvalidToken 例外狀況。請務必了解 Amazon Cognito 如何驗證 OpenID Connect (OIDC) 權杖。

注意

本文指出 (https://tools.ietf.org/html/rfc7523),Amazon Cognito 提供 5 分鐘的寬限期來處理系統間的所有時脈偏移。

  1. iss 參數必須符合登入對應所使用的金鑰 (例如 login.provider.com)。

  2. 這個簽章必須有效。簽章必須能夠透過 RSA 公開金鑰來驗證。

  3. 憑證公有金鑰的指紋符合您在建立 OIDC 供應商時在 IAM 中設定的指紋。

  4. 如果 azp 參數存在,請對照 OIDC 供應商中列出的用戶端 ID 來檢查這個值。

  5. 如果 azp 參數不存在,請對照 OIDC 供應商中列出的用戶端 ID 來檢查 aud 參數。

jwt.io 網站是很寶貴的資源,您可使用此資源將權杖解碼並驗證這些值。

Android

Map<String, String> logins = new HashMap<String, String>(); logins.put("login.provider.com", token); credentialsProvider.setLogins(logins);

iOS - Objective-C

credentialsProvider.logins = @{ "login.provider.com": token }

iOS - Swift

若要將 OIDC ID 權杖提供給 Amazon Cognito,請實作 AWSIdentityProviderManager 協定。

當實作 logins 方法時,請傳回包含您所設定 OIDC 供應商名稱的字典。這個字典可做為金鑰,並以來自已驗證使用者的現行 ID 權杖做為數值,如下列程式碼範例所示。

class OIDCProvider: NSObject, AWSIdentityProviderManager { func logins() -> AWSTask<NSDictionary> { let completion = AWSTaskCompletionSource<NSString>() getToken(tokenCompletion: completion) return completion.task.continueOnSuccessWith { (task) -> AWSTask<NSDictionary>? in //login.provider.name is the name of the OIDC provider as setup in the Amazon Cognito console return AWSTask(result:["login.provider.name":task.result!]) } as! AWSTask<NSDictionary> } func getToken(tokenCompletion: AWSTaskCompletionSource<NSString>) -> Void { //get a valid oidc token from your server, or if you have one that hasn't expired cached, return it //TODO code to get token from your server //... //if error getting token, set error appropriately tokenCompletion.set(error:NSError(domain: "OIDC Login", code: -1 , userInfo: ["Unable to get OIDC token" : "Details about your error"])) //else tokenCompletion.set(result:"result from server id token") } }

當您將 AWSCognitoCredentialsProvider執行個體化時,請傳遞在建構函式中將 AWSIdentityProviderManager 實作為 identityProviderManager 值的類別。如需詳細資訊,請前往AWSCognitoCredentialsProvider參考頁面,然後選擇「initWithRegion類型:identityPoolId:」identityProviderManager。

JavaScript

AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'IDENTITY_POOL_ID', Logins: { 'login.provider.com': token } });

Unity

credentials.AddLogin("login.provider.com", token);

Xamarin

credentials.AddLogin("login.provider.com", token);