INTEGRITY Документация

Создание токенов через API

Создавайте новые API-токены на лету прямо через API. Прежде чем это станет возможным, создайте в панели управления Cloudflare API-токен, который сможет создавать последующие токены.

Создание первоначального токена

Прежде чем использовать API, вам нужно создать первоначальный токен через панель управления Cloudflare. Необходимое разрешение зависит от операции API. Чтобы предоставить пользователям доступ к учётной записи в качестве участников, создайте токен с Аккаунт > Account Settings > Изменить. Чтобы создать токены API уровня аккаунта, создайте токен с помощью Аккаунт > Токены API аккаунта > Изменить. Чтобы создать токены API уровня пользователя, используйте Создание дополнительных токенов шаблон.

Рекомендации

При использовании Создание дополнительных токенов шаблон, Cloudflare настоятельно рекомендует не предоставлять токену дополнительные права. Обязательно защитите новый токен, поскольку с его помощью можно создавать токены с доступом к любым ресурсам пользователя.

Cloudflare также рекомендует ограничивать использование токена с помощью фильтрации по IP-адресу клиента или TTL, чтобы снизить риск злоупотребления в случае компрометации токена. См. Ограничение использования токена, где это описано подробнее.

Создание API-токенов через API

Вы можете создать для работы с API токен, принадлежащий пользователю, или токен, принадлежащий учётной записи. См. токен, принадлежащий пользователю или токен, принадлежащий аккаунту документацию по схеме API, чтобы узнать больше.

Чтобы создать токен:

  1. Определите политику.
  2. Определите ограничения.
  3. Создайте токен.

1. Определите политику Access

Access Policy определяет, к каким ресурсам может обращаться токен и какие права у него есть на эти ресурсы. Этот процесс похож на то, как вы создание токенов в панели управления 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.

Аккаунт

Включите в политику токена одну учетную запись или все учетные записи.

Zone

Включите одна зона, все зоны в аккаунте, или все зоны во всех аккаунтах в политике токена.

Пользователь

Для пользовательских ресурсов можно ссылаться только на самого себя, это обозначается так:"com.cloudflare.api.user.<USER_TAG>": "*"

Группы разрешений

Добавьте группы разрешений в API-токен, указав их id значений. Мы рекомендуем использовать id в качестве ключа для взаимодействия с Cloudflare API, при этом право доступа name носит косметический характер и может измениться. Группы разрешений привязаны к конкретным ресурсам (пользователь, аккаунт или зона), поэтому группа разрешений в политике применяется только к тому типу ресурса, для которого она предназначена.

Чтобы получить все доступные группы разрешений и их ID, используйте Список групп разрешений конечная точка:

Необходимые разрешения API-токена

Хотя бы одно из следующих права доступа токена требуется:
List Token Permission Groups
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"
      ]
    },
    // (...)
	]
}

2. Определите ограничения

Настройте ограничения на использование токена. 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-адрес.

3. Создайте токен

Объедините указанную выше информацию, чтобы создать токен, как показано в следующем примере:

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"
      ]
    }
  }
}'