

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

# 搭配使用者集區使用 OIDC 身分提供者
<a name="cognito-user-pools-oidc-idp"></a>

使用者可以使用 OpenID Connect (OIDC) 身分提供者 (IdPs) 的現有帳戶登入您的應用程式。透過 OIDC 提供者，獨立單一登入系統的使用者可以在應用程式接收使用者集區共用格式的 OIDC 字符時提供現有的登入資料。若要設定 OIDC IdP，請將您的 IdP 設定為 RP 來處理使用者集區，並將您的應用程式設定為 IdP 來處理使用者集區。Amazon Cognito 做為多個 OIDC IdPs 與您的應用程式之間的中繼步驟。您的使用者集區會將屬性映射規則套用至提供者直接傳遞至使用者集區的 ID 和存取字符中的宣告。然後，Amazon Cognito 會根據映射的使用者屬性，以及您透過 [Lambda 觸發](cognito-user-pools-working-with-lambda-triggers.md#lambda-triggers-for-federated-users)對身分驗證流程所做的任何其他調整來發出新權杖。

使用 OIDC IdP 登入的使用者不需要提供新的登入資料或資訊，即可存取您的使用者集區應用程式。您的應用程式可以無提示地將其重新導向至其 IdP 以進行登入，並將使用者集區作為背景工具，以標準化應用程式的字符格式。若要進一步了解 IdP 重新導向，請參閱 [授權端點](authorization-endpoint.md)。

如同其他第三方身分提供者，您必須向 OIDC 提供者註冊應用程式，並取得要連線至使用者集區之 IdP 應用程式的相關資訊。使用者集區 OIDC IdP 需要用戶端 ID、用戶端秘密、您要請求的範圍，以及提供者服務端點的相關資訊。您的使用者集區可以從探索端點探索提供者 OIDC 端點，也可以手動輸入。您還必須檢查提供者 ID 字符，並在 IdP 和使用者集區中的屬性之間建立屬性映射。

![使用者集區 OIDC IdP 身分驗證流程](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/flow-cup-oidc-endpoints.png)


如需此身分驗證流程的詳細資訊[OIDC 使用者集區 IdP 身分驗證流程](cognito-user-pools-oidc-flow.md)，請參閱 。

**注意**  
Amazon Cognito 使用者集區提供透過第三方 (聯合身分) 登入。此功能獨立於與 Amazon Cognito 身分集區的 OIDC 聯合。

您可以透過 或使用使用者集區 API 方法 [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html) AWS 管理主控台 AWS CLI，將 OIDC IdP 新增至 中的使用者集區。

**Topics**
+ [先決條件](#cognito-user-pools-oidc-idp-prerequisites)
+ [向 OIDC IdP 註冊應用程式](#cognito-user-pools-oidc-idp-step-1)
+ [新增 OIDC IdP 到您的使用者集區](#cognito-user-pools-oidc-idp-step-2)
+ [測試 OIDC IdP 組態](#cognito-user-pools-oidc-idp-step-3)
+ [OIDC 使用者集區 IdP 身分驗證流程](cognito-user-pools-oidc-flow.md)

## 先決條件
<a name="cognito-user-pools-oidc-idp-prerequisites"></a>

開始之前，您必須準備好以下事項：
+ 具有應用程式用戶端和使用者集區網域的使用者集區。如需詳細資訊，請參閱[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。
+ 具有以下組態的 OIDC IdP：
  + 支援 `client_secret_post` 用户端身分驗證。Amazon Cognito 不會在 OIDC 探索端點上為您的 IdP 檢查 `token_endpoint_auth_methods_supported` 宣告。Amazon Cognito 不支援 `client_secret_basic` 用户端身分驗證。如需用户端身分驗證的詳細資訊，請參閱 OpenID Connect 文件中的[用戶端身分驗證](https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication)。
  + 僅對 OIDC 端點使用 HTTPS，例如 `openid_configuration`、`userInfo` 和 `jwks_uri`。
  + 僅對 OIDC 端點使用 TCP 連接埠 80 和 443。
  + 僅使用 HMAC-SHA、ECDSA 或 RSA 演算法對 ID 權杖進行簽署。
  + 在其 `jwks_uri` 發佈金鑰 ID `kid` 宣告並在其權杖中包含 `kid` 宣告。
  + 呈現具有有效根 CA 信任鏈的未過期公有金鑰。

## 向 OIDC IdP 註冊應用程式
<a name="cognito-user-pools-oidc-idp-step-1"></a>

將 OIDC IdP 新增至使用者集區組態並將其指派給應用程式用戶端之前，請在 IdP 中設定 OIDC 用戶端應用程式。您的使用者集區是使用 IdP 管理身分驗證的依賴方應用程式。

**向 OIDC IdP 註冊**

1. 向 OIDC IdP 建立開發人員帳戶。  
**OIDC IdPs 的連結**    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/cognito-user-pools-oidc-idp.html)

1. 透過您的 OIDC IdP 來註冊具有 `/oauth2/idpresponse` 端點的使用者集區網域 URL。這可確保稍後當 OIDC IdP 驗證使用者時，可從 Amazon Cognito 接受它。

   ```
   https://{{mydomain.auth.us-east-1.amazoncognito.com}}/oauth2/idpresponse
   ```

1. 選取您希望使用者目錄與使用者集區共用[的範圍](cognito-user-pools-define-resource-servers.md#cognito-user-pools-define-resource-servers-about-scopes)。OIDC IdPs 必須提供範圍 **openid**，才能提供任何使用者資訊。需要 `email`範圍才能授予 `email`和 `email_verified`[宣告](https://openid.net/specs/openid-connect-basic-1_0.html#StandardClaims)的存取權。OIDC 規格中的其他範圍`profile`適用於所有使用者屬性，`phone`適用於 和 `phone_number` `phone_number_verified`。

1. OIDC IdP 為您提供用戶端 ID 和用戶端秘密。請記下這些值，並將其新增至您稍後新增至使用者集區的 OIDC IdP 組態。

**範例：使用 Salesforce 做為使用者集區的 OIDC IdP**

 當您想要在 OIDC 相容的 IdP (例如 Salesforce) 和您的使用者集區之間建立信任，請使用 OIDC IdP。

1. 在 Salesforce 開發人員網站上[建立帳戶](https://developer.salesforce.com/signup)。

1. [透過您在之前步驟設定的開發人員帳戶登入](https://developer.salesforce.com)。

1. 在 Salesforce 頁面上，執行下列其中一項操作：
   +  如果使用的是 Lightning Experience，請選擇設定齒輪圖示，然後選擇 **Setup Home (設定首頁)**。
   +  如果是使用 Salesforce Classic，則使用者界面頁首會顯示 **Setup** (設定)，請選擇此選項。
   +  如果是使用 Salesforce Classic，但頁首卻沒有出現 **Setup** (設定)，則請從最上面導覽列中選擇您的姓名，然後從下拉式清單中選擇 **Setup** (設定)。

1. 在左側導覽列中，選擇 **Company Settings** (公司設定)。

1. 在導覽列，選擇 **Domain** (網域)、輸入網域，然後選擇 **Create** (建立)。

1. 在左側導覽列，在 **Platform Tools** (平台工具) 下選擇 **Apps** (應用程式)。

1. 選擇 **App Manager** (應用程式管理員)。

1. 

   1. 選擇 **New connected app** (新的連線應用程式)。

   1. 完成必要欄位。

      在 **Start URL (開始 URL)** 下方，使用您的 Salesforce IdP 登入的使用者集區網域其 `/authorize` 端點中。當您的使用者存取連線應用程式時，Salesforce 會將他們引導到此 URL 以完成登入。然後，Salesforce 會將使用者重新導向至已與您應用程式用戶端相關聯的回呼 URL。

      ```
      https://{{mydomain.auth.us-east-1.amazoncognito.com}}/authorize?response_type=code&client_id={{<your_client_id>}}&redirect_uri={{https://www.example.com}}&identity_provider={{CorpSalesforce}}
      ```

   1. 啟用 **OAuth settings** (OAuth 設定)，然後在 **Callback URL** (回呼 URL) 中輸入您使用者集區網域之 `/oauth2/idpresponse` 端點的 URL。這是 Salesforce 核發 Amazon Cognito 用於交換 OAuth 權杖的授權碼所在的 URL。

      ```
      https://{{mydomain.auth.us-east-1.amazoncognito.com}}/oauth2/idpresponse
      ```

1. 選擇您的[範圍](https://openid.net/specs/openid-connect-basic-1_0.html#Scopes)。您必須包含範圍 **OpenID**。若要授予 **email** 與 **email\_verified** [宣告](https://openid.net/specs/openid-connect-basic-1_0.html#StandardClaims)的存取權，請新增 **email** 範圍。以空格區隔範圍。

1. 選擇 **Create** (建立)。

   在 Salesforce 中，用戶端 ID 稱為**消費者金鑰**，而用戶端秘密則稱為**消費者秘密**。記下您的用戶端 ID 和用戶端秘密。您會在下一節中用到它們。

## 新增 OIDC IdP 到您的使用者集區
<a name="cognito-user-pools-oidc-idp-step-2"></a>

設定 IdP 之後，您可以將使用者集區設定為使用 OIDC IdP 處理身分驗證請求。

------
#### [ Amazon Cognito console ]

**在主控台中新增 OIDC IdP**

1. 前往 [Amazon Cognito 主控台](https://console.aws.amazon.com/cognito/home)。若出現提示，請輸入 AWS 憑證。

1. 從導覽選單中，選擇 **Users Pools** (使用者集區)。

1. 從清單中選擇現有的使用者集區，或[建立使用者集區](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html)。

1. 選擇**社交和外部提供者**選單，然後選取**新增身分提供者**。

1. 選擇 **OpenID Connect** IdP。

1. 輸入唯一的**供應商名稱**。

1. 輸入 IdP **用戶端 ID**。這是您在 OIDC IdP 中建置的應用程式用戶端 ID。您提供的用戶端 ID 必須是您已設定 回呼 URL 的 OIDC 提供者`https://{{[your user pool domain]}}/oauth2/idpresponse`。

1. 輸入 IdP **用戶端秘密**。這必須是上一個步驟中相同應用程式用戶端的用戶端秘密。

1. <a name="cognito-user-pools-oidc-step-2-substep-9"></a>輸入此供應商的 **Authorized scopes** (授權範圍)。範圍會定義您的應用程式從您的供應商請求的使用者屬性群組 (例如 `name` 和 `email`)。範圍必須以空格隔開，遵循 [OAuth 2.0](https://tools.ietf.org/html/rfc6749#section-3.3) 規格。

   您的 IdP 可能會提示使用者在登入時同意提供這些屬性給您的應用程式。

1. 選擇**屬性請求方法**。IdPs可能需要對其`userInfo`端點的請求格式化為 `GET`或 `POST`。例如，Amazon Cognito `userInfo`端點需要 `HTTP GET` 請求。

1. 針對您希望使用者集區決定 IdP 中金鑰 OIDC 聯合端點路徑的方式，選擇**設定方法**。一般而言，IdPs會在發行者基本 URL 託管`/well-known/openid-configuration`端點。如果您的提供者發生這種情況，**自動填入發行者 URL** 選項會提示您輸入該基本 URL，嘗試從該處存取`/well-known/openid-configuration`路徑，並讀取其中列出的端點。您可能有非典型的端點路徑，或希望透過替代代理將請求傳遞至一或多個端點。在此情況下，選取**手動輸入**，並指定 `authorization`、`userInfo`、 `token`和 `jwks_uri`端點的路徑。
**注意**  
URL 的開頭應為 `https://`，結尾不應有正斜線 `/`。只有連接埠號碼 443 和 80 可以搭配此 URL 使用。例如，Salesforce 使用此 URL：  
`https://login.salesforce.com`   
如果您選擇自動填入，則探索文件必須針對以下值使用 HTTPS：`authorization_endpoint`、`token_endpoint`、`userinfo_endpoint` 和 `jwks_uri`。否則登入會失敗。

1. 在 ** OpenID Connect 提供者和使用者集區之間的映射屬性**下設定屬性映射規則。**使用者集區屬性**是 Amazon Cognito 使用者設定檔中的*目的地*屬性，而 **OpenID Connect 屬性**是您希望 Amazon Cognito 在 ID 金鑰宣告或`userInfo`回應中找到的*來源*屬性。Amazon Cognito 會自動將目的地使用者設定檔`username`中的 OIDC 宣告**子** 映射至 。

   如需詳細資訊，請參閱[將 IdP 屬性映射至設定檔和字符](cognito-user-pools-specifying-attribute-mapping.md)。

1. 選擇**新增身分提供者**。

1. 從**應用程式用戶端**功能表中，從清單中選擇應用程式用戶端。導覽至**登入頁面**索引標籤，然後在**受管登入頁面組態**下，選取**編輯**。尋找**身分提供者**並新增新的 OIDC IdP。

1. 選擇**儲存變更**。

------
#### [ API/CLI ]

請參閱 [CreateIdentityProvider](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_CreateIdentityProvider.html#API_CreateIdentityProvider_Example_2) 中範例二的 OIDC 組態。您可以修改此語法，並將其用作 [create-identity-provider](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-identity-provider.html) 的 `CreateIdentityProvider`、 `UpdateIdentityProvider`或 `--cli-input-json`輸入檔案的請求內文。

------

## 測試 OIDC IdP 組態
<a name="cognito-user-pools-oidc-idp-step-3"></a>

在您的應用程式中，您必須在使用者的用戶端中叫用瀏覽器，以便他們可以使用其 OIDC 供應商登入。在您完成上述章節中的設定程序後，向您的供應商測試登入。下列範例 URL 會使用字首網域載入使用者集區的登入頁面。

```
https://{{mydomain.auth.us-east-1.amazoncognito.com}}/oauth2/authorize?response_type=code&client_id={{1example23456789}}&redirect_uri={{https://www.example.com}}
```

此連結是當您前往**應用程式用戶端**選單、選取應用程式用戶端、導覽至**登入頁面**索引標籤，然後選取**檢視登入頁面**時，Amazon Cognito 會引導您前往的頁面。如需使用者集區網域的詳細資訊，請參閱 [設定使用者集區網域](cognito-user-pools-assign-domain.md)。如需應用程式用戶端的詳細資訊，包括用戶端 IDs和回呼 URLs，請參閱 [使用應用程式用戶端的應用程式特定設定](user-pool-settings-client-apps.md)。

下列範例連結[授權端點](authorization-endpoint.md)會使用`identity_provider`查詢參數，`MyOIDCIdP`從 設定供應商的無提示重新導向。此 URL 會使用受管登入略過互動式使用者集區登入，並直接前往 IdP 登入頁面。

```
https://{{mydomain.auth.us-east-1.amazoncognito.com}}/oauth2/authorize?identity_provider={{MyOIDCIdP}}&response_type=code&client_id={{1example23456789}}&redirect_uri={{https://www.example.com}}
```