授权 API 密钥 API

编辑

代表另一个用户创建 API 密钥。

请求

编辑

POST /_security/api_key/grant

先决条件

编辑
  • 要使用此 API,您必须具有 grant_api_keymanage_api_key 集群权限。

描述

编辑

此 API 与 创建 API 密钥 类似,但它为与运行 API 的用户不同的用户创建 API 密钥。

调用者必须具有代表其创建 API 密钥的用户的身份验证凭据。不使用该用户的凭据,则无法使用此 API 创建 API 密钥。支持的用户身份验证凭据类型包括:* 用户名和密码 * Elasticsearch 访问令牌 * JWT

提供身份验证凭据的用户可以选择 “以其他用户身份运行”(模拟)另一个用户。在这种情况下,将代表模拟用户创建 API 密钥。

此 API 旨在供需要为最终用户创建和管理 API 密钥的应用程序使用,但无法保证这些用户有权代表自己创建 API 密钥(请参阅 先决条件)。API 密钥由 Elasticsearch API 密钥服务创建,该服务会自动启用。

成功的授权 API 密钥 API 调用会返回一个 JSON 结构,其中包含 API 密钥、其唯一 ID 和其名称。如果适用,它还会返回 API 密钥的过期信息(以毫秒为单位)。

默认情况下,API 密钥永不过期。您可以在创建 API 密钥时指定过期信息。

有关与 API 密钥服务相关的配置设置,请参阅 API 密钥服务设置

请求正文

编辑

可以在 POST 请求的正文中指定以下参数

access_token
(必需*,字符串)用户的 Elasticsearch 访问令牌 或 JWT。支持 访问id JWT 令牌类型,它们取决于底层的 JWT realm 配置。创建的 API 密钥将具有使用此令牌进行身份验证的用户的权限的时间点快照(甚至更受限制的权限,请参阅 role_descriptors 参数)。如果指定 access_token 授权类型,则此参数为必需。它与其他授权类型无效。
api_key

(必需,对象)定义 API 密钥。

expiration
(可选,字符串)API 密钥的过期时间。默认情况下,API 密钥永不过期。
name
(必需,字符串)指定此 API 密钥的名称。
role_descriptors
(可选,对象)此 API 密钥的角色描述符。此参数是可选的。如果未指定或为空数组,则 API 密钥具有指定用户或访问令牌权限的时间点快照。如果提供角色描述符,则结果权限是 API 密钥权限与用户或访问令牌的权限的交集。角色描述符的结构与 创建 API 密钥 API 的请求相同。
metadata
(可选,对象)您想要与 API 密钥关联的任意元数据。它支持嵌套的数据结构。在 metadata 对象中,以 _ 开头的键保留供系统使用。
client_authentication

(可选,对象)当使用 access_token 授权类型,并提供 JWT 时,这将指定 JWT 需要的客户端身份验证(即 ES-Client-Authentication 请求头通常指定的内容)。

scheme
(必需,字符串)方案(区分大小写),就像在 ES-Client-Authentication 请求头中提供的一样。目前,唯一支持的值是 SharedSecret
value
(必需,字符串)遵循客户端凭据方案的值,就像在 ES-Client-Authentication 请求头中提供的一样。例如,如果请求头为 ES-Client-Authentication: SharedSecret myShar3dS3cret,如果客户端要直接使用 JWT 进行身份验证,则此处的 value 应为 myShar3dS3cret
grant_type

(必需,字符串)授权类型。支持的授权类型包括:access_tokenpassword

access_token
在这种授权类型中,您必须提供由 Elasticsearch 令牌服务创建的访问令牌(请参阅 获取令牌加密 Elasticsearch 的 HTTP 客户端通信),或者 JWT(JWT access_token 或 JWT id_token)。
password
在这种授权类型中,您必须提供要为其创建 API 密钥的用户 ID 和密码。
password
(必需*,字符串)用户的密码。如果指定 password 授权类型,则此参数为必需。它与其他授权类型无效。
username
(必需*,字符串)标识用户的用户名。如果指定 password 授权类型,则此参数为必需。它与其他授权类型无效。
run_as
(可选,字符串)要模拟的用户的名称。

*表示该设置在某些情况下是必需的,但并非在所有情况下都是必需的。

示例

编辑
resp = client.security.grant_api_key(
    grant_type="password",
    username="test_admin",
    password="x-pack-test-password",
    api_key={
        "name": "my-api-key",
        "expiration": "1d",
        "role_descriptors": {
            "role-a": {
                "cluster": [
                    "all"
                ],
                "indices": [
                    {
                        "names": [
                            "index-a*"
                        ],
                        "privileges": [
                            "read"
                        ]
                    }
                ]
            },
            "role-b": {
                "cluster": [
                    "all"
                ],
                "indices": [
                    {
                        "names": [
                            "index-b*"
                        ],
                        "privileges": [
                            "all"
                        ]
                    }
                ]
            }
        },
        "metadata": {
            "application": "my-application",
            "environment": {
                "level": 1,
                "trusted": True,
                "tags": [
                    "dev",
                    "staging"
                ]
            }
        }
    },
)
print(resp)
const response = await client.security.grantApiKey({
  grant_type: "password",
  username: "test_admin",
  password: "x-pack-test-password",
  api_key: {
    name: "my-api-key",
    expiration: "1d",
    role_descriptors: {
      "role-a": {
        cluster: ["all"],
        indices: [
          {
            names: ["index-a*"],
            privileges: ["read"],
          },
        ],
      },
      "role-b": {
        cluster: ["all"],
        indices: [
          {
            names: ["index-b*"],
            privileges: ["all"],
          },
        ],
      },
    },
    metadata: {
      application: "my-application",
      environment: {
        level: 1,
        trusted: true,
        tags: ["dev", "staging"],
      },
    },
  },
});
console.log(response);
POST /_security/api_key/grant
{
  "grant_type": "password",
  "username" : "test_admin",
  "password" : "x-pack-test-password",
  "api_key" : {
    "name": "my-api-key",
    "expiration": "1d",
    "role_descriptors": {
      "role-a": {
        "cluster": ["all"],
        "indices": [
          {
          "names": ["index-a*"],
          "privileges": ["read"]
          }
        ]
      },
      "role-b": {
        "cluster": ["all"],
        "indices": [
          {
          "names": ["index-b*"],
          "privileges": ["all"]
          }
        ]
      }
    },
    "metadata": {
      "application": "my-application",
      "environment": {
         "level": 1,
         "trusted": true,
         "tags": ["dev", "staging"]
      }
    }
  }
}

提供其凭据的用户(test_admin)可以“以其他用户身份运行”另一个用户(test_user)。API 密钥将授予模拟用户(test_user)。

resp = client.security.grant_api_key(
    grant_type="password",
    username="test_admin",
    password="x-pack-test-password",
    run_as="test_user",
    api_key={
        "name": "another-api-key"
    },
)
print(resp)
const response = await client.security.grantApiKey({
  grant_type: "password",
  username: "test_admin",
  password: "x-pack-test-password",
  run_as: "test_user",
  api_key: {
    name: "another-api-key",
  },
});
console.log(response);
POST /_security/api_key/grant
{
  "grant_type": "password",
  "username" : "test_admin",  
  "password" : "x-pack-test-password",  
  "run_as": "test_user",  
  "api_key" : {
    "name": "another-api-key"
  }
}

为其提供凭据并执行“以其他用户身份运行”的用户。

上述用户的凭据

将为其创建 API 密钥的模拟用户。