

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

# 搭配使用者集區使用 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\$1verified** [宣告](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
```

# OIDC 使用者集區 IdP 身分驗證流程
<a name="cognito-user-pools-oidc-flow"></a>

透過 OpenID Connect (OIDC) 登入，您的使用者集區會使用您的身分提供者 (IdP) 自動化授權碼登入流程。您的使用者使用其 IdP 完成登入後，Amazon Cognito 會在外部供應商的`oauth2/idpresponse`端點收集其程式碼。使用產生的存取權杖，您的使用者集區會查詢 IdP `userInfo`端點以擷取使用者屬性。然後，您的使用者集區會將收到的屬性與您設定的屬性映射規則進行比較，並相應地填入使用者的設定檔和 ID 字符。

您在 OIDC 供應商組態中請求的 OAuth 2.0 範圍會定義 IdP 提供給 Amazon Cognito 的使用者屬性。作為最佳安全實務，僅請求對應至您要映射至使用者集區的屬性的範圍。例如，如果您的使用者集區請求 `openid profile`，您會取得所有可能的屬性，但如果您請求 `openid email phone_number` ，則只會取得使用者的電子郵件地址和電話號碼。您可以設定從 [OIDC IdPs 請求](cognito-user-pools-oidc-idp.md#cognito-user-pools-oidc-step-2-substep-9)的範圍，與您在[應用程式用戶端](user-pool-settings-client-apps.md#user-pool-settings-client-apps-scopes)和使用者集區身分驗證請求中授權和請求的範圍不同。

當您的使用者使用 OIDC IdP 登入您的應用程式時，您的使用者集區會執行下列身分驗證流程。

1. 使用者存取您的受管登入頁面，並選擇使用其 OIDC IdP 登入。

1. 您的應用程式會將使用者的瀏覽器導向使用者集區的授權端點。

1. 您的使用者集區會將請求重新導向至 OIDC IdP 的授權端點。

1. 您的 IdP 會顯示登入提示。

1. 在您的應用程式中，使用者的工作階段會顯示 OIDC IdP 的登入提示。

1. 使用者輸入其 IdP 的登入資料，或為已驗證的工作階段提供 Cookie。

1. 使用者驗證後，OIDC IdP 會使用授權碼重新導向至 Amazon Cognito。

1. 您的使用者集區會交換 ID 和存取權杖的授權碼。當您使用範圍 設定 IdP 時，Amazon Cognito 會收到存取字符`openid`。ID 字符中的宣告和`userInfo`回應是由 IdP 組態中的其他範圍決定，例如 `profile`和 `email`。

1. 您的 IdP 會發出請求的權杖。

1. 您的使用者集區會從 IdP 組態中的發行者 URLs 決定 IdP `jwks_uri`端點的路徑，並從 JSON Web 金鑰集 (JWKS) 端點請求權杖簽署金鑰。

1. IdP 會從 JWKS 端點傳回簽署金鑰。

1. 您的使用者集區會從字符中的簽章和過期資料驗證 IdP 字符。

1. 您的使用者集區會使用存取權杖授權 IdP `userInfo`端點的請求。IdP 會根據存取權杖範圍以使用者資料回應。

1. 您的使用者集區會將 IdP 的 ID 字符和`userInfo`回應與使用者集區中的屬性映射規則進行比較。它會將映射的 IdP 屬性寫入使用者集區設定檔屬性。

1. Amazon Cognito 發出您的應用程式承載權杖，其中可能包括身分、存取和重新整理權杖。

1. 您的應用程式會處理使用者集區字符並登入使用者。

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


**注意**  
Amazon Cognito 會取消未在 5 分鐘內完成的身分驗證請求，並將使用者重新導向至受管登入。此頁面人會顯示「`Something went wrong`」錯誤訊息。

OIDC 是位於 OAuth 2.0 頂端的身分層級，指定由 IdP 向 OIDC 用戶端應用程式 (依賴方) 發出的 JSON 格式 (JWT) 身分字符。請參閱 OIDC IdP 的文件以取得新增 Amazon Cognito 做為 OIDC 依賴方的相關資訊。

當使用者使用授權碼授予進行驗證時，使用者集區會傳回 ID、存取和重新整理權杖。ID 權杖是用於身分管理的標準 [OIDC](http://openid.net/specs/openid-connect-core-1_0.html) 權杖，而存取權杖是標準 [OAuth 2.0](https://oauth.net/2/) 權杖。如需使用者集區應用程式用戶端可支援的授予類型詳細資訊，請參閱 [授權端點](authorization-endpoint.md)。

## 使用者集區如何處理來自 OIDC 提供者的宣告
<a name="how-a-cognito-user-pool-processes-claims-from-an-oidc-provider"></a>

當您的使用者透過第三方 OIDC 供應商完成登入時，受管登入會從 IdP 擷取授權碼。您的使用者集區會交換授權碼，以取得您 IdP 的 `token` 端點的存取和 ID 權杖。您的使用者集區不會將這些權杖傳遞至使用者或應用程式，但會用它們來建置使用者設定檔，且包含自己所屬權杖的宣告中顯示的資料。

 Amazon Cognito 不會單獨驗證存取權杖。而是向提供者 `userInfo` 端點請求使用者屬性資訊，並預期權杖無效時，請求會遭拒。

Amazon Cognito 會透過下列檢查來驗證提供者 ID 權杖：

1. 檢查提供者是否使用下列集合的演算法簽署權杖：RSA、HMAC、Elliptic Curve。

1. 如果提供者使用非對稱簽署演算法簽署權杖，請檢查權仗 `kid` 宣告中的簽署金鑰 ID 是否於提供者 `jwks_uri` 端點列出。Amazon Cognito 會針對其處理的每個 IdP ID 字符，從 IdP 組態中的 JWKS 端點重新整理簽署金鑰。

1. 根據提供者中繼資料，比較 ID 權杖簽名與預期的簽名。

1. 將 `iss` 宣告與針對 IdP 設定的 OIDC 發行者進行比較。

1. 比較 `aud` 宣告是否與 IdP 上設定的用戶端 ID 相符，或者如果 `aud` 宣告中有多個值，則比較宣告是否包含設定的用戶端 ID。

1. 檢查 `exp` 宣告中的時間戳記是否未早於目前時間。

您的使用者集區會驗證 ID 權杖，然後嘗試向提供者 `userInfo` 端點提出提供者存取權杖的請求。它會擷取範圍落在授權其讀取的存取權仗內的任何使用者設定檔資訊。接著，您的使用者集區就可以搜尋您在使用者集區中設定的必要使用者屬性。您必須在提供者組態中為必要的屬性建立屬性映射。您的使用者集區會檢查提供者 ID 權杖和 `userInfo` 回應。您的使用者集區會將符合映射規則的所有宣告，寫入使用者集區使用者設定檔上的使用者屬性中。您的使用者集區會忽略符合映射規則但不是必要，且在提供者的宣告中找不到的屬性。