

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

# 使用带有共享密钥的 JSON Web 令牌（JWT）
<a name="create-index-access-control-tokens-jwtshared"></a>

以下示例说明在创建索引时如何使用带有共享密钥令牌的 JSON Web Token（JWT）进行用户访问控制。

------
#### [ Console ]

1. 选择**创建索引**以开始创建新索引。

1. 在**指定索引详细信息**页面上，为您的索引指定名称和描述。

1. 对于 **IAM 角色**，选择一个角色或选择**创建新角色**，并指定角色名称来创建新角色。该 IAM 角色将带有前缀 “AmazonKendra-”。

1. 将所有其他字段保留为默认值。选择**下一步**。

1. 在**配置用户访问控制**页面上，在**访问控制设置**下，选择**是**以使用令牌进行访问控制。

1. 在**令牌配置**下，选择**带有共享密钥的 JWT** 作为**令牌类型**。

1. 在**用于签名共享密钥的参数**下，选择**密钥类型**。您可以使用现有的 AWS Secrets Manager 共享密钥或创建一个新共享密钥。

   要创建新共享密钥，请选择**新建**，然后按照下列步骤操作：

   1. 在 “**新 AWS Secrets Manager 密钥**” 下，指定**密钥名称**。保存公有密钥时，将添加前缀 `AmazonKendra-`。

   1. 指定**键 ID**。键 ID 是一个提示，指示哪些键用于保护令牌的 JSON Web 签名。

   1. 为令牌选择签名**算法**。这是用于保护 ID 令牌的加密算法。有关 RSA 的更多信息，请参阅 [RSA 密码术](https://tools.ietf.org/html/rfc3447)。

   1. 通过输入 base64 URL 编码的密钥来指定**共享密钥**。您也可以选择**生成密钥**来为您生成密钥。您必须确保该密钥是 base64 URL 编码的密钥。

   1. （*可选*）指定共享密钥何时有效。您可以指定密钥有效期的开始日期、截止日期，或同时指定两者。该密钥将在指定的时间间隔内有效。

   1. 选择**保存密钥**以保存新密钥。

1. （*可选*）在**高级配置**下：

   1. 指定要在 ACL 检查中使用的**用户名**。

   1. 指定要在 ACL 检查中使用的一个或多个**组**。

   1. 指定将验证颁发机构的**颁发机构**。

   1. 指定**声明 ID**。您必须指定与 JWT 中的受众相匹配的正则表达式。

1. 在**配置详细信息**页面中，选择**开发者版本**。

1. 选择**创建**以创建索引。

1. 等待您的索引创建完成。 Amazon Kendra 为您的索引配置硬件。此操作可能需要一些时间。

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

您可以将 JWT 令牌与内部共享密钥一起使用。 AWS Secrets Manager该密钥必须是 base64 URL 编码的密钥。你需要 Secrets Manager ARN，而且你的 Amazon Kendra 角色必须有权访问该`GetSecretValue`资源。 Secrets Manager 如果您使用加密 Secrets Manager 资源 AWS KMS，则该角色还必须有权访问解密操作。

要使用 JSON 输入文件创建索引，请先 AWS CLI 使用所需参数创建一个 JSON 文件：

```
{
    "Name": "user-context",
    "Edition": "ENTERPRISE_EDITION",
    "RoleArn": "arn:aws:iam::account-id:role:/my-role",
    "UserTokenConfigurations": [
        {
            "JwtTokenTypeConfiguration": {
                "KeyLocation": "SECRET_MANAGER",
                "Issuer": "optional: specify the issuer url",
                "ClaimRegex": "optional: regex to validate claims in the token",
                "UserNameAttributeField": "optional: user",
                "GroupAttributeField": "optional: group",
                "SecretManagerArn": "arn:aws:secretsmanager:us-west-2:account id:secret:/my-user-context-secret
            }
        }
    ],    
    "UserContextPolicy": "USER_TOKEN"
}
```

您可以覆盖默认的用户和组字段名称。`UserNameAttributeField` 的默认值为“user”。`GroupAttributeField` 的默认值为“groups”。

接下来，使用输入文件调用 `create-index`。例如，如果您的 JSON 文件名为 `create-index-openid.json`，则可以使用以下名称：

```
aws kendra create-index --cli-input-json file://create-index-openid.json
```

密钥必须采用以下格式 AWS Secrets Manager：

```
{
  "keys": [
    {
      "kid": "key_id",
      "alg": "HS256|HS384|HS512",
      "kty": "OCT", 
      "use": "sig", //this value can be sig only for now
      "k": "secret",
      "nbf":"ISO1806 date format"
      "exp":"ISO1806 date format"
    }
  ]
}
```

有关 JWT 的更多信息，请参阅 [jwt.io](http://jwt.io)。

------
#### [ Python ]

您可以将 JWT 令牌与内部共享密钥一起使用。 AWS Secrets Manager该密钥必须是 base64 URL 编码的密钥。你需要 Secrets Manager ARN，而且你的 Amazon Kendra 角色必须有权访问该`GetSecretValue`资源。 Secrets Manager 如果您使用加密 Secrets Manager 资源 AWS KMS，则该角色还必须有权访问解密操作。

```
response = kendra.create_index(
    Name='user-context',
    Edition='ENTERPRISE_EDITION',
    RoleArn='arn:aws:iam::account-id:role:/my-role',
    UserTokenConfigurations=[
        {
            "JwtTokenTypeConfiguration": {
                "KeyLocation": "URL",
                "Issuer": "optional: specify the issuer url",
                "ClaimRegex": "optional: regex to validate claims in the token",
                "UserNameAttributeField": "optional: user",
                "GroupAttributeField": "optional: group",
                "SecretManagerArn": "arn:aws:secretsmanager:us-west-2:account id:secret:/my-user-context-secret"
            }
        }
    ],
    UserContextPolicy='USER_TOKEN'
)
```

------