通过 API 动态生成新的 API 令牌。在此之前,您必须在 Cloudflare 仪表板中创建一个可以创建后续令牌的 API 令牌。
在通过 API 创建令牌之前,您需要通过 Cloudflare 仪表板生成初始令牌。
Cloudflare 强烈建议在使用此模板时不要授予其他权限。请妥善保管新令牌,因为它可以创建有权访问用户任何资源的令牌。
Cloudflare 还建议通过客户端 IP 地址过滤或 TTL 限制令牌的使用,以降低令牌泄露后被滥用的风险。有关更多信息,请参阅限制令牌使用。
您可以创建用户拥有的令牌或账户拥有的令牌以配合 API 使用。有关更多信息,请参阅用户拥有的令牌或账户拥有的令牌 API 架构文档。
要创建令牌:
- 定义策略。
- 定义限制。
- 创建令牌。
访问策略定义令牌可以对哪些资源执行操作,以及令牌对这些资源拥有哪些权限。此过程类似于您在 Cloudflare 仪表板中创建令牌的方式。
每个令牌可以包含多个策略。
[
{
"id": "f267e341f3dd4697bd3b9f71dd96247f",
"effect": "allow",
"resources": {
"com.cloudflare.api.account.zone.eb78d65290b24279ba6f44721b3ea3c4": "*",
"com.cloudflare.api.account.zone.22b1de5f1c0e4b3ea97bb1e963b06a43": "*"
},
"permission_groups": [
{
"id": "c8fed203ed3043cba015a93ad1616f1f",
"name": "Zone Read"
},
{
"id": "82e64a83756745bbbb1c9c2701bf816b",
"name": "DNS Read"
}
]
}
]| 字段 | 说明 |
|---|---|
id |
创建后生成的唯一只读策略标识符。 |
effect |
定义此策略是允许还是拒绝访问。如果只创建一个策略,使用 allow。策略的评估顺序如下:1. 显式 DENY 策略;2. 显式 ALLOW 策略;3. 隐式 DENY ALL。 |
resources |
定义允许配置哪些资源。 |
permission_groups |
定义策略授予所含资源的权限。 |
API 令牌策略支持三种资源类型:User、Account 和 Zone。
在令牌策略中包含单个账户或所有账户。
- 单个账户表示为:
"com.cloudflare.api.account.<ACCOUNT_ID>": "*"。 - 所有账户表示为:
"com.cloudflare.api.account.*": "*"
在令牌策略中包含单个 zone、账户中的所有 zone 或所有账户中的所有 zone。
- 单个 zone 表示为:
"com.cloudflare.api.account.zone.<ZONE_ID>": "*" - 账户中的所有 zone 表示为:
"com.cloudflare.api.account.<ACCOUNT_ID>": {"com.cloudflare.api.account.zone.*": "*"} - 所有账户中的所有 zone 表示为:
"com.cloudflare.api.account.zone.*": "*"
对于用户资源,您只能引用自己,表示为:"com.cloudflare.api.user.<USER_TAG>": "*"
通过指定权限组的 id 值将其添加到 API 令牌。我们建议使用 id 作为与 Cloudflare API 交互的键;权限 name 仅用于显示,可能会更改。权限组的作用范围限定于特定资源(user、account 或 zone),因此策略中的权限组仅适用于其对应作用范围的资源类型。
要获取所有可用权限组及其 ID,请使用 List permission groups 端点:
Required API token permissions
At least one of the following token permissions is required:API Tokens WriteAPI Tokens Read
curl "https://api.cloudflare.com/client/v4/user/tokens/permission_groups" \
--request GET \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"{
"result": [
{
"id": "19637fbb73d242c0a92845d8db0b95b1",
"name": "AI Crawl Control Read",
"description": "Grants access to reading AI Crawl Control",
"scopes": [
"com.cloudflare.api.account.zone"
]
},
{
"id": "1ba6ab4cacdb454b913bbb93e1b8cb8c",
"name": "AI Crawl Control Write",
"description": "Grants access to reading and editing AI Crawl Control",
"scopes": [
"com.cloudflare.api.account.zone"
]
},
// (...)
]
}设置令牌使用方式的任何限制。API 令牌允许对客户端 IP 地址过滤和 TTL 进行限制。有关更多信息,请参阅限制令牌使用。
定义 TTL 时,可以使用 not_before 设置令牌生效的时间,使用 expires_on 设置过期时间。这两个字段都采用以下格式的 UTC 时间戳:"2018-07-01T05:20:00Z"。
使用以下对象按客户端 IP 地址过滤限制令牌的使用:
{
"request.ip": {
"in": ["199.27.128.0/21", "2400:cb00::/32"],
"not_in": ["199.27.128.0/21", "2400:cb00::/32"]
}
}in 和 not_in 对象中的每个参数必须使用 CIDR 表示法。例如,使用 192.168.0.1/32 指定单个 IP 地址。
将上述信息组合起来创建令牌,如下例所示:
curl "https://api.cloudflare.com/client/v4/accounts/{account_id}/tokens" \
--header "Authorization: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
"name": "readonly token",
"policies": [
{
"effect": "allow",
"resources": {
"com.cloudflare.api.account.zone.eb78d65290b24279ba6f44721b3ea3c4": "*",
"com.cloudflare.api.account.zone.22b1de5f1c0e4b3ea97bb1e963b06a43": "*"
},
"permission_groups": [
{
"id": "c8fed203ed3043cba015a93ad1616f1f",
"name": "Zone Read"
},
{
"id": "82e64a83756745bbbb1c9c2701bf816b",
"name": "DNS Read"
}
]
}
],
"not_before": "2020-04-01T05:20:00Z",
"expires_on": "2020-04-10T00:00:00Z",
"condition": {
"request.ip": {
"in": [
"199.27.128.0/21",
"2400:cb00::/32"
],
"not_in": [
"199.27.128.1/32"
]
}
}
}'curl "https://api.cloudflare.com/client/v4/user/tokens" \
--header "Authorization: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
"name": "readonly token",
"policies": [
{
"effect": "allow",
"resources": {
"com.cloudflare.api.account.zone.eb78d65290b24279ba6f44721b3ea3c4": "*",
"com.cloudflare.api.account.zone.22b1de5f1c0e4b3ea97bb1e963b06a43": "*"
},
"permission_groups": [
{
"id": "c8fed203ed3043cba015a93ad1616f1f",
"name": "Zone Read"
},
{
"id": "82e64a83756745bbbb1c9c2701bf816b",
"name": "DNS Read"
}
]
}
],
"not_before": "2020-04-01T05:20:00Z",
"expires_on": "2020-04-10T00:00:00Z",
"condition": {
"request.ip": {
"in": [
"199.27.128.0/21",
"2400:cb00::/32"
],
"not_in": [
"199.27.128.1/32"
]
}
}
}'curl "https://api.cloudflare.com/client/v4/user/tokens" \
--header "Authorization: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
"name": "readonly token",
"policies": [
{
"effect": "allow",
"resources": {
"com.cloudflare.api.account.zone.eb78d65290b24279ba6f44721b3ea3c4": "*",
"com.cloudflare.api.account.zone.22b1de5f1c0e4b3ea97bb1e963b06a43": "*"
},
"permission_groups": [
{
"id": "c8fed203ed3043cba015a93ad1616f1f",
"name": "Zone Read"
},
{
"id": "82e64a83756745bbbb1c9c2701bf816b",
"name": "DNS Read"
}
]
}
],
"not_before": "2020-04-01T05:20:00Z",
"expires_on": "2020-04-10T00:00:00Z",
"condition": {
"request.ip": {
"in": [
"199.27.128.0/21",
"2400:cb00::/32"
],
"not_in": [
"199.27.128.1/32"
]
}
}
}'