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

Context Enricher

Zaraz Context Enricher представляет собой инструмент для изменения или обогащения context который используется в Zaraz с помощью Cloudflare Worker. Context Enricher дает доступ к клиентским и системным переменным.

Создание Worker

Чтобы использовать Context Enricher, сначала создайте новый Cloudflare Worker. Сделать это можно через панель управления Cloudflare или с помощью Wrangler.

Чтобы создать новый Worker в панели управления Cloudflare:

  1. На панели управления Cloudflare перейдите к разделу Workers & Pages страницу.

    Перейдите в Workers & Pages ↗
  2. Выберите Создать приложение.

  3. Укажите имя для Worker и выберите Развернуть.

  4. Выберите Изменить код.

Теперь у вас есть простой Worker, отвечающий строкой "Hello world." Чтобы этот Worker работал в качестве Context Enricher, измените код так, чтобы он возвращал контекст обратно:

export default {
  async fetch(request, env, ctx) {
    const { system, client } = await request.json();

    // Here goes your modification to the system or client objects.
    /*
      For example, to change the country to a fictitious "Pirate's Island" ("PI"), use:
      system.device.location.country = 'PI';
    */

    return new Response(JSON.stringify({ system, client }));
  },
};

Продолжайте чтение, чтобы увидеть более полные примеры для разных сценариев использования, или обратитесь к Zaraz Context.

Настройка Context Enricher

Теперь, когда Worker опубликован, его можно выбрать в настройках Zaraz:

  1. На панели управления Cloudflare перейдите к разделу Настройки страницу.

    Перейдите в Настройки ↗
  2. Выберите свой Context Enricher Worker.

  3. Сохраните настройки.

Теперь ваш Context Enricher будет выполняться для всех запросов Zaraz в этой зоне.

Пример Context Enricher

Добавление произвольной информации с помощью API

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

function getWeatherForLocation({ client, system }) {
  // Get the location from the context.
  const { city } = system.device.location;

  // Get the weather from an API.
  const response = await fetch(
    `https://wttr.in/${encodeURIComponents(city)}?format=j1`
  ).then((response) => response.json());

  // Add the weather to the context.
  client.weather = weather;

  return { client, system };
}

export default {
  async fetch(request, env, ctx) {
    const { system, client } = await request.json();

    // Add the weather to the context.
    const newContext = getWeatherForLocation({ system, client });

    // Return as JSON
    return new Response(JSON.stringify(newContext));
  },
};

Теперь свойство weather можно использовать в любом месте Zaraz, выбрав Track Property из поля ввода атрибутов и введя weather.

Маскирование конфиденциальной информации, например адресов электронной почты

Предположим, что нужно скрыть конфиденциальную информацию, например адреса электронной почты. Для этого мы заменим все вхождения email-адресов в контексте. Учтите, что это лишь пример, который может подойти не для всех пограничных случаев и сценариев использования.

Для простоты в этом примере мы заменим все строки, содержащие @ символ:

function redactEmailAddressesFromObject(context) {
  // Loop through all keys of the object.
  for (const key in context) {
    // Check if the value is a string.
    if (typeof context[key] === "string") {
      // Check if the string contains an @ symbol.
      if (context[key].includes("@")) {
        // Replace the string with a redacted version.
        context[key] = "[email protected]";
      }
    } else if (typeof context[key] === "object") {
      // Recursively call this function to redact the object.
      context[key] = redactEmailAddressesFromObject(context[key]);
    }
  }

  return context;
}

export default {
  async fetch(request, env, ctx) {
    const { system, client } = await request.json();

    // Redact email addresses from the context.
    const newContext = redactEmailAddressesFromObject({ system, client });

    // Return as JSON
    return new Response(JSON.stringify(newContext));
  },
};