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

Пользовательские метаданные

Возможно, вы захотите настроить параметры для отдельных имён хостов (клиентов), которые выходят за рамки возможностей Rules или Rate Limiting.

Для этого сначала нужно обратиться в свою account team, чтобы получить доступ к Custom Metadata. После настройки пользовательских метаданных их можно использовать следующими способами:


Примеры

Дополнительную логику и требования обсудите со своим Solutions Engineer.

Отправка пользовательских метаданных

Вы можете добавить пользовательские метаданные в Cloudflare через Custom Hostnames API. Эти данные можно добавить с помощью PATCH запрос к конкретному ID хостнейма, чтобы задать для него метаданные, например:

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

Хотя бы одно из следующих права доступа токена требуется:
Edit Custom Hostname
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/custom_hostnames/$CUSTOM_HOSTNAME_ID" \
	--request PATCH \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"ssl": {
				"method": "http",
				"type": "dv"
		},
		"custom_metadata": {
				"customer_id": "12345",
				"redirect_to_https": true,
				"security_tag": "low"
		}
	}'

Изменения метаданных распространяются по периферийной сети Cloudflare в течение 30 секунд.


Доступ к пользовательским метаданным из Cloudflare Worker

Объект metadata будет доступен при каждом запросе с помощью request.cf.hostMetadata свойство. После этого вы можете считывать эти данные и с помощью Worker настраивать на их основе любое поведение.

В примере ниже мы будем использовать в Worker значение user_id, отправленное с помощью описанного выше вызова API "custom_metadata":{"customer_id":"12345","redirect_to_https": true,"security_tag":"low"}, и настройте заголовок запроса так, чтобы он отправлял customer_id к origin:

export default {
	/**
	 * Fetch and add a X-Customer-Id header to the origin based on hostname
	 * @param {Request} request
	 */
	async fetch(request, env, ctx) {
		const customer_id = request.cf.hostMetadata.customer_id;
		const newHeaders = new Headers(request.headers);
		newHeaders.append("X-Customer-Id", customer_id);

		const init = {
			headers: newHeaders,
			method: request.method,
		};
		return fetch(request.url, init);
	},
};
export default {
	/**
	 * Fetch and add a X-Customer-Id header to the origin based on hostname
	 * @param {Request} request
	 */
	async fetch(request, env, ctx): Promise<Response> {
		const customer_id = request.cf.hostMetadata.customer_id;
		const newHeaders = new Headers(request.headers);
		newHeaders.append("X-Customer-Id", customer_id);

		const init = {
			headers: newHeaders,
			method: request.method,
		};
		return fetch(request.url, init);
	},
} satisfies ExportedHandler<Env>;

Доступ к пользовательским метаданным в выражении правила

Используйте cf.hostname.metadata поле для доступа к объекту metadata в выражениях правил. Различные значения из объекта JSON можно получить с помощью lookup_json_string функцию.

Следующее выражение правила определяет, что правило сработает, если security_tag значение в пользовательских метаданных содержит значение low:

lookup_json_string(cf.hostname.metadata, "security_tag") eq "low"

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

Как правило, рекомендуется следовать Google's JSON Style guide ↗ где это уместно.


Ограничения

На метаданные, которые можно передать Cloudflare, распространяются некоторые ограничения:

Поддержка Terraform

Terraform допускает карты только одного типа, поэтому поддержка Terraform в Cloudflare для пользовательских метаданных пользовательских имён хостов ограничена строковыми ключами и значениями.