

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 创建私有人力 (OIDC IdP)
<a name="sms-workforce-create-private-oidc"></a>

当您想使用自己的 OpenID Connect (OIDC) 身份提供者 (IdP) 对工作人员进行身份验证和管理时，请使用身份提供者创建一个私有人力。使用此页面学习如何配置您的 IdP 以与 Amazon Ground Truth（G SageMaker round Truth）或亚马逊增强人工智能（Amazon A2I）进行通信，并学习如何使用您自己的 IdP 创建员工队伍。

要使用 OIDC IdP 创建人力，您的 IdP 必须支持*组*，因为 Ground Truth 和 Amazon A2I 会使用您指定的一个或多个组来创建工作团队。您可以使用工作团队为标注作业和人工审核任务指定工作人员。由于组不是一种[标准声明](https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)，您的 IdP 可能会对一组用户（工作人员）采用不同的命名约定。因此，您必须使用从 IdP 发送到 Ground Truth 或 Amazon A2I 的自定义声明 `sagemaker:groups` 来识别工作人员所属的一个或多个用户组。要了解更多信息，请参阅[向 Ground Truth 和 Amazon A2I 发送必需和可选的声明](#sms-workforce-create-private-oidc-configure-idp)。

您可以使用 API 操作创建 OIDC IdP 员工。 SageMaker [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateWorkforce.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateWorkforce.html)创建私有人力后，该人力及其关联的所有工作团队和工作人员都可用于所有 Ground Truth 标注作业任务和 Amazon A2I 人工审核工作流任务。要了解更多信息，请参阅[创建 OIDC IdP 人力](#sms-workforce-create-private-oidc-createworkforce)。

## 向 Ground Truth 和 Amazon A2I 发送必需和可选的声明
<a name="sms-workforce-create-private-oidc-configure-idp"></a>

当您使用自己的 IdP 时，Ground Truth 和 Amazon A2I 会通过从您的 `AuthorizationEndpoint` 获得身份验证 CODE，使用 `Issuer`、`ClientId` 和 `ClientSecret` 对工作人员进行身份验证。

Ground Truth 和 Amazon A2I 将使用此 CODE 从 IdP 的 `TokenEndpoint` 或 `UserInfoEndpoint` 获取自定义声明。您可以配置 `TokenEndpoint` 以返回 JSON Web 令牌 (JWT)，或配置 `UserInfoEndpoint` 以返回 JSON 对象。JWT 或 JSON 对象必须包含您指定的必需和可选声明。[声明](https://openid.net/specs/openid-connect-core-1_0.html#Terminology)是一个键值对，其中包含有关工作人员的信息或有关 OIDC 服务的元数据。下表列出了 IdP 返回的 JWT 或 JSON 对象中必须包含和可以选择包含的声明。

**注意**  
下表中的某些参数可以使用 `:` 或 `-` 指定。例如，您可以使用声明中的 `sagemaker:groups` 或 `sagemaker-groups` 指定工作人员所属的组。


|  Name  | 必需 | 接受的格式和值 | 说明 | 示例 | 
| --- | --- | --- | --- | --- | 
|  `sagemaker:groups` 或 `sagemaker-groups`  |  是  |  **数据类型**： 如果工作人员属于单个组，请使用字符串标识该组。 如果工作人员属于多个组，请使用最多 10 个字符串的列表。 **允许的字符**： Regex：[\$1p\$1L\$1\$1p\$1M\$1\$1p\$1S\$1\$1p\$1N\$1\$1p\$1P\$1]\$1 **限额**： 每个工作人员 10 个组 每个组名称 63 个字符  |  将工作人员分配给一个或多个组。组用于将工作人员映射到工作团队。  |  属于单个组的工作人员示例：`"work_team1"` 属于多个组的工作人员示例：`["work_team1", "work_team2"]`  | 
|  `sagemaker:sub` 或 `sagemaker-sub`  |  是  |  **数据类型**： 字符串  |  这对于在 Ground Truth 平台内跟踪工作人员身份进行审计以及识别该工作人员处理的任务是必需的。 对于 ADFS：客户必须使用主安全标识符 (SID)。  |  `"111011101-123456789-3687056437-1111"`  | 
|  `sagemaker:client_id` 或 `sagemaker-client_id`  |  是  |  **数据类型**： 字符串 **允许的字符**： Regex：[\$1w\$1-]\$1 **限额**： 128 个字符   |  客户端 ID。必须为此客户端 ID 发放所有令牌。  |  `"00b600bb-1f00-05d0-bd00-00be00fbd0e0"`  | 
|  `sagemaker:name` 或 `sagemaker-name`  |  是  |  **数据类型**： 字符串  |  要在工作人员门户中显示的工作人员名称。  |  `"Jane Doe"`  | 
|  `email`  |  否  |  **数据类型**： 字符串  |  工作人员的电子邮件。Ground Truth 使用此电子邮件通知工作人员，他们已被邀请参加标注任务。如果您为工作人员所在的工作团队设置了 Amazon SNS 主题，Ground Truth 还会在标注任务可用时使用此电子邮件通知该工作人员。  |  `"example-email@domain.com"`  | 
|  `email_verified`  |  否  |  **数据类型**： 布尔型 **接受的值**： `True`, `False`  |  指示用户电子邮件是否经过验证。  |  `True`  | 

以下是您的 `UserInfoEndpoint` 可以返回的 JSON 对象语法示例。

```
{
    "sub":"122",
    "exp":"10000",
    "sagemaker-groups":["group1","group2"]
    "sagemaker-name":"name",
    "sagemaker-sub":"122",
    "sagemaker-client_id":"123456"
}
```

Ground Truth 或 Amazon A2I 会对 `sagemaker:groups` 或 `sagemaker-groups` 中列出的组进行比较，以验证您的工作人员是否属于标注作业或人工审核任务中指定的工作团队。验证工作团队后，标注作业或人工审核任务将发送给该工作人员。

## 创建 OIDC IdP 人力
<a name="sms-workforce-create-private-oidc-createworkforce"></a>

您可以使用 SageMaker API 操作`CreateWorkforce`和相关的特定语言 SDKs创建员工。在参数 `OidcConfig` 中指定 `WorkforceName` 和有关 OIDC IDP 的信息。建议您使用占位符重定向 URI 配置 OIDC，然后在创建人力后使用工作人员门户 URL 更新 URI。要了解更多信息，请参阅[配置 OIDC IdP](#sms-workforce-create-private-oidc-configure-url)。

下面显示了一个请求示例。请参阅 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateWorkforce.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateWorkforce.html)，了解有关此请求中每个参数的更多信息。

```
CreateWorkforceRequest: {
    #required fields
    WorkforceName: "example-oidc-workforce",
    OidcConfig: { 
        ClientId: "clientId",
        ClientSecret: "secret",
        Issuer: "https://example-oidc-idp.com/adfs",
        AuthorizationEndpoint: "https://example-oidc-idp.com/adfs/oauth2/authorize",
        TokenEndpoint: "https://example-oidc-idp.com/adfs/oauth2/token",
        UserInfoEndpoint: "https://example-oidc-idp.com/adfs/oauth2/userInfo",
        LogoutEndpoint: "https://example-oidc-idp.com/adfs/oauth2/log-out",
        JwksUri: "https://example-oidc-idp.com/adfs/discovery/keys"
    },
    SourceIpConfig: {
        Cidrs: ["string", "string"]
    }
}
```

### 配置 OIDC IdP
<a name="sms-workforce-create-private-oidc-configure-url"></a>

如何配置 OIDC IdP 取决于您使用的 IdP 和您的业务需求。

配置 IdP 时，必须指定回调或重定向 URI。在 Ground Truth 或 Amazon A2I 对工作人员进行身份验证后，此 URI 将工作人员重定向到工作人员门户，工作人员可以在那里访问标注或人工审核任务。要创建工作人员门户 URL，需要使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateWorkforce.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateWorkforce.html) API 操作创建一个包含 OIDC IdP 详细信息的人力。具体来说，您必须使用所需的自定义 sagemaker 声明配置 OIDC IdP（详见下一节）。因此，建议您使用占位重定向 URI 配置 OIDC，然后在创建人力后更新 URI。请参阅[创建 OIDC IdP 人力](#sms-workforce-create-private-oidc-createworkforce)，了解如何使用此 API 创建人力。

您可以在 G SageMaker round Truth 控制台中或使用 SageMaker API 操作查看您的工作人员门户网址`DescribeWorkforce`。工作人员门户 URL 位于响应的 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_Workforce.html#sagemaker-Type-Workforce-SubDomain](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_Workforce.html#sagemaker-Type-Workforce-SubDomain) 参数中。

**重要**  
确保将人力子域添加到 OIDC IdP 允许列表中。将子域添加到允许列表时，它必须以 `/oauth2/idpresponse` 结尾。

**在创建私有人力后查看工作人员门户 URL（控制台）：**

1. 打开 SageMaker AI 控制台，网址为[https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)。

1. 在导航窗格中，选择**标注人力**。

1. 选择**私有**选项卡。

1. 在**私有人力摘要**中，您将看到**标注门户登录 URL**。这是您的工作人员门户 URL。

**在创建私有人力后查看工作人员门户 URL (API)：**

使用 `[CreateWorkforce](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateWorkforce.html)` 创建私有人力时，需要指定一个 `WorkforceName`。使用此名称调用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeWorkforce.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeWorkforce.html)。下表包括使用 AWS CLI 和的请求示例 适用于 Python (Boto3) 的 AWS SDK。

------
#### [ SDK for Python (Boto3) ]

```
response = client.describe_workforce(WorkforceName='string')
print(f'The workforce subdomain is: {response['SubDomain']}')
```

------
#### [ AWS CLI ]

```
$ C:\>  describe-workforce --workforce-name 'string'
```

------

## 验证 OIDC IdP 人力身份验证响应
<a name="sms-workforce-create-private-oidc-validate"></a>

创建 OIDC IdP 人力后，可以通过以下过程使用 cURL 验证其身份验证工作流。此过程假定您可以访问终端，并已安装 cURL。

**要验证 OIDC IdP 授权响应，请执行以下操作：**

1. 使用如下配置的 URI 获取授权码：

   ```
   {AUTHORIZE ENDPOINT}?client_id={CLIENT ID}&redirect_uri={REDIRECT URI}&scope={SCOPE}&response_type=code
   ```

   1. 将 *`{AUTHORIZE ENDPOINT}`* 替换为 OIDC IdP 的授权端点。

   1. `{CLIENT ID}`替换为客户提供的客户 OAuth 端 ID。

   1. 将 *`{REDIRECT URI}`* 替换为工作人员门户 URL。如果 `/oauth2/idpresponse` 尚不存在，则必须将其添加到 URL 的末尾。

   1. 如果您有自定义范围，请使用它来替换 `{SCOPE}`。如果您没有自定义范围，请将 `{SCOPE}` 替换为 `openid`。

   下面是经过上述修改后的 URI 示例：

   ```
   https://example.com/authorize?client_id=f490a907-9bf1-4471-97aa-6bfd159f81ac&redirect_uri=https%3A%2F%2F%2Fexample.labeling.sagemaker.aws%2Foauth2%2Fidpresponse&response_type=code&scope=openid
   ```

1. 将步骤 1 中修改后的 URI 复制并粘贴到浏览器中，然后按键盘上的 Enter 键。

1. 使用 IdP 进行身份验证。

1. 复制 URI 中的身份验证码查询参数。此参数存在于 `code=`。以下是响应内容的示例。在此示例中，复制 `code=MCNYDB...` 和此后的所有内容。

   ```
   https://example.labeling.sagemaker.aws/oauth2/idpresponse?code=MCNYDB....
   ```

1. 在进行以下所列的必要修改后，打开终端并输入以下命令：

   ```
   curl --request POST \
     --url '{TOKEN ENDPOINT}' \
     --header 'content-type: application/x-www-form-urlencoded' \
     --data grant_type=authorization_code \
     --data 'client_id={CLIENT ID}' \
     --data client_secret={CLIENT SECRET} \
     --data code={CODE} \
     --data 'redirect_uri={REDIRECT URI}'
   ```

   1. 将 `{TOKEN ENDPOINT}` 替换为 OIDC IdP 的令牌端点。

   1. `{CLIENT ID}`替换为客户提供的客户 OAuth 端 ID。

   1. `{CLIENT SECRET}`替换为来自您的 OAuth 客户端的客户机密钥。

   1. 将 `{CODE}` 替换为您在步骤 4 中复制的身份验证码查询参数。

   1. 将 *`{REDIRECT URI}`* 替换为工作人员门户 URL。

   下面是进行上述修改后的 cURL 请求示例：

   ```
   curl --request POST \
     --url 'https://example.com/token' \
     --header 'content-type: application/x-www-form-urlencoded' \
     --data grant_type=authorization_code \
     --data 'client_id=f490a907-9bf1-4471-97aa-6bfd159f81ac' \
     --data client_secret=client-secret \
     --data code=MCNYDB... \
     --data 'redirect_uri=https://example.labeling.sagemaker.aws/oauth2/idpresponse'
   ```

1. 此步骤取决于 IdP 返回的 `access_token` 类型，是纯文本访问令牌还是 JWT 访问令牌。
   + 如果 IdP 不支持 JWT 访问令牌，则 `access_token` 可以是纯文本（例如 UUID）。您看到的响应可能类似于下面的内容。在这种情况下，请转到步骤 7。

     ```
     {
       "access_token":"179c144b-fccb-4d96-a28f-eea060f39c13",
       "token_type":"Bearer",
       "expires_in":3600,
       "refresh_token":"ef43e52e-9b4f-410c-8d4c-d5c5ee57631a",
       "scope":"openid"
     }
     ```
   + 如果 IdP 支持 JWT 访问令牌，则步骤 5 应生成 JWT 格式的访问令牌。例如，响应可能类似于下面的内容：

     ```
     {
         "access_token":"eyJh...JV_adQssw5c",
         "refresh_token":"i6mapTIAVSp2oJkgUnCACKKfZxt_H5MBLiqcybBBd04",
         "refresh_token_expires_in":6327,
         "scope":"openid",
         "id_token":"eyJ0eXAiOiJK9...-rDaQzUHl6cQQWNiDpWOl_lxXjQEvQ"
     }
     ```

     复制 JWT 并对其进行解码。您可以使用 python 脚本或第三方网站进行解码。例如，您可以访问网站 [https://jwt.io/](https://jwt.io/)，并将 JWT 粘贴到**编码**框中进行解码。

     确保解码后的响应包含以下内容：
     + 表格中的**必需** SageMaker 人工智能声明，请参见[向 Ground Truth 和 Amazon A2I 发送必需和可选的声明](#sms-workforce-create-private-oidc-configure-idp)。如果没有，则必须重新配置 OIDC IdP 以包含这些声明。
     + 您在设置 IdP 人力时指定的[发行者](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OidcConfig.html#sagemaker-Type-OidcConfig-Issuer)。

1. 在进行下面列出的必要修改后，在终端中输入以下命令：

   ```
   curl -X POST -H 'Authorization: Bearer {ACCESS TOKEN}' -d '' -k -v {USERINFO ENDPOINT}
   ```

   1. 将 `{USERINFO ENDPOINT}` 替换为 OIDC IdP 的用户信息端点。

   1. 将 `{ACCESS TOKEN}` 替换为在步骤 7 中收到的响应中的访问令牌。这是 `"access_token"` 参数的条目。

   下面是进行上述修改后的 cURL 请求示例：

   ```
    curl -X POST -H 'Authorization: Bearer eyJ0eX...' -d '' -k -v https://example.com/userinfo
   ```

1. 对上述过程中最后一步的响应可能类似于下面的代码块。

   如果步骤 6 中返回的 `access_token` 是纯文本，则必须验证此响应是否包含所需信息。在这种情况下，响应中必须包含表中的 “**必需**的 SageMaker AI 声明” [向 Ground Truth 和 Amazon A2I 发送必需和可选的声明](#sms-workforce-create-private-oidc-configure-idp)。例如 `sagemaker-groups`、`sagamaker-name`。

   ```
   {
       "sub":"122",
       "exp":"10000",
       "sagemaker-groups":["group1","group2"]
       "sagemaker-name":"name",
       "sagemaker-sub":"122",
       "sagemaker-client_id":"123456"
   }
   ```

## 后续步骤
<a name="sms-workforce-create-private-oidc-next-steps"></a>

使用 IdP 创建私有人力并验证 IdP 身份验证响应后，可以使用 IdP 组创建工作团队。要了解更多信息，请参阅[管理私有人力 (OIDC IdP)](sms-workforce-manage-private-oidc.md)。

您可以将员工对任务的访问权限限制为特定 IP 地址，并使用 SageMaker API 更新或删除您的员工。要了解更多信息，请参阅[使用 Amazon SageMaker API 进行私人劳动力管理](sms-workforce-management-private-api.md)。