Разрешения настраиваемых шаблонов на стороне сервера

В этом документе описываются разрешения для пользовательских шаблонов на стороне сервера.


Каждое разрешение:

  • Проверено API, которым они требуются.
  • Автоматически обнаруживается в изолированном JavaScript в зависимости от используемых API. Это происходит при внесении изменений в редакторе пользовательских шаблонов (для быстрого цикла обратной связи) и при компиляции кода (для проверки соблюдения правильных разрешений).
  • Редактируется в редакторе пользовательских шаблонов, чтобы сделать разрешение более конкретным.
  • Доступен для запросов в изолированном JavaScript через API queryPermission .

access_bigquery

Отображаемое имя: Доступ к BigQuery.

Описание: Обеспечивает доступ к BigQuery на Google Cloud Platform.

Конфигурация: опция, позволяющая использовать указанные комбинации проекта, набора данных и таблиц с BigQuery. Установка конфигурации идентификатора проекта GOOGLE_CLOUD_PROJECT позволит использовать переменную среды GOOGLE_CLOUD_PROJECT в качестве идентификатора проекта, если projectId исключен из BigQuery API parameter .

Требуется: BigQuery

Сигнатура запроса: queryPermission('access_bigquery', <operation>, <options>)

Примечания: <operation> — это строка, которая может иметь следующие значения:

  • писать

<options> — это объект, содержащий следующие элементы:

{
  'projectId': <project_id>,
  'datasetId': <dataset_id>,
  'tableId': <table_id>
}

Пример кода

const BigQuery = require('BigQuery');
const queryPermission = require('queryPermission');

const connectionInfo = {
  'projectId': 'gcp-cloud-project-id',
  'datasetId': 'destination-dataset',
  'tableId': 'destination-table',
};

if (queryPermission('access_bigquery', 'write', connectionInfo)) {
  const rows = [{
    'column1': 'String1',
    'column2': 1234,
  }];
  const options = {
    'ignoreUnknownValues': true,
    'skipInvalidRows': false,
  };

  BigQuery.insert(connectionInfo, rows, options)
      .then(data.gtmOnSuccess, data.gtmOnFailure);
}

access_firestore

Отображаемое имя: Доступ к Google Firestore.

Описание: Разрешает доступ к Google Firestore.

Конфигурация: опция, позволяющая использовать указанные комбинации проекта и пути (поддерживается подстановочный синтаксис) с Firestore. Установка конфигурации идентификатора проекта GOOGLE_CLOUD_PROJECT позволит использовать переменную среды GOOGLE_CLOUD_PROJECT в качестве идентификатора проекта, когда projectId исключен из Firestore API parameter .

Требуется: Firestore

Сигнатура запроса: queryPermission('access_firestore', <operation>, <options>)

Примечания: <operation> — это строка, которая может иметь следующие значения:

  • read — предоставляет доступ к API-интерфейсам чтения и запроса.
  • write — предоставляет доступ к API записи.
  • read_write — предоставляет доступ к API чтения, записи и запроса.

<options> — это объект, содержащий следующие элементы:

{
  'projectId': <project_id>,
  'path': <path>
}

Пример кода

const Firestore = require('Firestore');
const queryPermission = require('queryPermission');

const options = {
  'projectId': 'gcp-cloud-project-id',
  'path': 'collection/document',
};

if (queryPermission('access_firestore', 'read', options)) {
  Firestore.read('collection/document', {
    projectId: 'gcp-cloud-project-id',
  }).then(data.gtmOnSuccess, data.gtmOnFailure);
}

access_response

Отображаемое имя: Доступ к ответу

Описание. Доступ к телу ответа, заголовкам или статусу.

Конфигурация: возможность разрешить любой или конкретный доступ с дополнительными параметрами для управления доступом к различным подкомпонентам.

Требуется: setPixelResponse , setResponseBody , setResponseHeader , setResponseStatus

Сигнатура запроса: queryPermission('access_response', 'write', <component>[, <optional component name>])

Примечания. Определяет, доступен ли доступ к компоненту исходящего ответа HTTP.

Пример кода

const queryPermission = require('queryPermission');
const setResponseBody = require('setResponseBody');
const setResponseHeader = require('setResponseHeader');
const setResponseStatus = require('setResponseStatus');
if (queryPermission('access_response', 'write', 'header', 'Content-Type')) {
  setResponseHeader('Content-Type', 'text/plain');
}
if (queryPermission('access_response', 'write', 'body')) {
  setResponseBody('Not Found');
}
if (queryPermission('access_response', 'write', 'status')) {
  setResponseStatus(404);
}

access_template_storage

Отображаемое имя: Доступ к хранилищу шаблонов.

Описание: Обеспечивает доступ к временному хранилищу для шаблонов, которые могут сохраняться в течение всего времени существования серверного процесса.

Конфигурация: Нет

Требуется: templateDataStorage

Подпись запроса: queryPermission('access_template_storage')

Пример кода

const queryPermission = require('queryPermission');
const templateDataStorage = require('templateDataStorage');
const key = 'my_key';
if (queryPermission('access_template_storage')) {
  const value = templateDataStorage.getItemCopy(key);
}

get_cookies

Отображаемое имя: Считывает значения файлов cookie.

Описание: Считывает значения файлов cookie с указанным именем.

Конфигурация: список имен файлов cookie, разрешенных для чтения.

Требуется: getCookieValues

Сигнатура запроса: queryPermission('get_cookies', <name>)

Примечания. Определяет возможность чтения файла cookie в зависимости от его имени.

Пример кода

const queryPermission = require('queryPermission');
const getCookieValues = require('getCookieValues');
const cookieName = 'info';
let cookieValues;
if (queryPermission('get_cookies', cookieName)) {
  cookieValues = getCookieValues(cookieName);
}

Ведение журнала

Отображаемое имя: Журналы на консоли.

Описание: вход в консоль разработчика и режим предварительного просмотра Диспетчера тегов.

Конфигурация: возможность включить вход в производство. По умолчанию включено только ведение журнала в режиме отладки/предварительного просмотра. Если в разрешении отказано, logToConsole не выдаст ошибку, но заблокирует сообщение журнала.

Требуется: logToConsole

Сигнатура запроса: queryPermission('logging')

Примечания. Определяет, может ли пользовательский шаблон войти в консоль разработчика.

Пример кода

const queryPermission = require('queryPermission');
const logToConsole = require('logToConsole');
// Note that it's fine to call log, since the log call will be ignored if
// logging isn't permitted in the current environment.
logToConsole('diagnostic info');

use_message

Отображаемое имя: Использует сообщения

Описание: Отправляет или получает сообщения с помощью API-интерфейсов addMessageListener или sendMessage .

Конфигурация: возможность указать тип сообщения и возможность прослушивания, отправки или того и другого шаблона.

Требуется: addMessageListener , sendMessage

Сигнатура запроса: queryPermission('use_message', <usage>, <message type>)

Примечания: использование может быть одним из listen , send или listen_and_send .

Пример кода

const queryPermission = require('queryPermission');
const sendMessage = require('sendMessage');
if (queryPermission('use_message', 'send', 'set_cookie')) {
  sendMessage('set_cookie', {name: 'foo', value: 'bar'});
}

read_container_data

Отображаемое имя: Считывает данные контейнера.

Описание: Считывает данные о контейнере.

Конфигурация: Нет.

Требуется: getClientName , getContainerVersion

Подпись запроса: queryPermission('read_container_data')

Примечания. Определяет, может ли пользовательский шаблон читать данные контейнера.

Пример кода

const getContainerVersion = require('getContainerVersion');
const queryPermission = require('queryPermission');
if (queryPermission('read_container_data')) {
  return getContainerVersion();
}

read_event_data

Отображаемое имя: Считывает данные о событии.

Описание: Считывает данные из события.

Конфигурация: возможность разрешить любой доступ или конкретный доступ, управляемый списком разрешенных путей ключей (поддерживается синтаксис подстановочных знаков).

Требуется: getAllEventData , getEventData

Подпись запроса: queryPermission('read_event_data'[, <optional key>])

Примечания. Определяет, может ли пользовательский шаблон читать данные событий по заданному ключевому пути (или все данные событий, если ключевой путь не указан).

Пример кода

const getAllEventData = require('getAllEventData');
const queryPermission = require('queryPermission');
if (queryPermission('read_event_data')) {
  return getAllEventData();
}
const getEventData = require('getEventData');
const queryPermission = require('queryPermission');
const keyPath = 'parentField.childField';
if (queryPermission('read_event_data', keyPath)) {
  return getEventData(keyPath);
}

read_event_metadata

Отображаемое имя: Считывает метаданные события.

Описание: Считывает метаданные событий в обратных вызовах событий.

Конфигурация: Нет

Требуется: addEventCallback

Подпись запроса: queryPermission('read_event_metadata')

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

Пример кода

const queryPermission = require('queryPermission');
const addEventCallback = require('addEventCallback');
if (queryPermission('read_event_metadata')) {
  addEventCallback((containerId, eventMetadata) => {
    // Read event metadata.
  });
}

read_request

Отображаемое имя: Чтение HTTP-запроса.

Описание: Считывает заголовки запроса, параметры запроса, тело, путь или удаленный IP-адрес.

Конфигурация: возможность разрешить любой или конкретный доступ с дополнительными параметрами для управления доступом к различным подкомпонентам.

Требуется: extractEventsFromMpv1 , extractEventsFromMpv2 , getRemoteAddress , getRequestBody , getRequestHeader , getRequestPath , getRequestQueryParameter , getRequestQueryParameters , getRequestQueryString

Сигнатура запроса: queryPermission('read_request', <component>[, <optional component name>])

Примечания. Управляет доступностью компонента входящего ответа HTTP.

Пример кода

const queryPermission = require('queryPermission');
const getRequestBody = require('getRequestBody');
const getRequestHeader = require('getRequestHeader');
let body, contentType;
if (queryPermission('read_request', 'body')) {
  body = getRequestBody();
}
if (queryPermission('read_request', 'header', 'content-type')) {
  contentType = getRequestHeader('content-type');
}
if (body && contentType == 'application/json') { ... }

return_response

Отображаемое имя: Возвращает ответ

Описание: Возвращает ответ вызывающему абоненту.

Конфигурация: Нет

Требуется: returnResponse

Сигнатура запроса: queryPermission('return_response')

Примечания. Это разрешение не имеет полей для сужения и обычно не запрашивается.

run_container

Отображаемое имя: Запускает контейнер.

Описание: Запускает контейнер с событием.

Конфигурация: Нет

Требуется: runContainer

Сигнатура запроса: queryPermission('run_container')

Примечания. Это разрешение не имеет полей для сужения и обычно не запрашивается.

send_http

Отображаемое имя: отправляет HTTP-запросы.

Описание: Отправляет HTTP-запрос на указанный URL-адрес.

Требуется: getGoogleScript , sendEventToGoogleAnalytics , sendHttpGet , sendHttpRequest .

Подпись запроса: queryPermission('send_http', <url>)

Примечания. Определяет возможность выполнения HTTP-запроса в зависимости от URL-адреса. Чтобы обеспечить безопасное соединение, разрешены только безопасные URL-адреса (HTTPS).

Пример кода

const queryPermission = require('queryPermission');
const sendHttpGet = require('sendHttpGet');
const url = 'https://example.com/search?query=foo&results=10';
if (queryPermission('send_http', url)) {
  sendHttpGet(url);
}

send_pixel_from_browser

Отображаемое имя: отправляет пиксели из браузеров.

Описание: Отправляет запрос GET на указанный URL-адрес из браузера.

Требуется: sendPixelFromBrowser

Сигнатура запроса: queryPermission('send_pixel_from_browser', <url>)

Примечания. Определяет, можно ли отправить запрос из браузера, в зависимости от URL-адреса.

Пример кода

const queryPermission = require('queryPermission');
const sendPixelFromBrowser = require('sendPixelFromBrowser');
const url = 'https://example.com/search?query=foo&results=10';
if (queryPermission('send_pixel_from_browser', url)) {
  sendPixelFromBrowser(url);
}

set_cookies

Отображаемое имя: Устанавливает файл cookie.

Описание: Устанавливает файл cookie с указанным именем и параметрами.

Конфигурация: таблица разрешенных имен файлов cookie, каждое из которых имеет дополнительные ограничения по имени, домену, пути, атрибуту secure и сроку действия.

Требуется: setCookie

Сигнатура запроса: queryPermission('set_cookies', <name>, <options>)

Примечания. Определяет, можно ли добавить к ответу данный заголовок Set-Cookie, в зависимости от имени файла cookie, домена, пути, атрибута secure и срока действия.

Пример кода

const queryPermission = require('queryPermission');
const setCookie = require('setCookie');
const options = {
  'domain': 'www.example.com',
  'path': '/',
  'max-age': 60*60*24*365,
  'secure': true
};
if (queryPermission('set_cookies', 'info', options)) {
  setCookie('info', 'xyz', options);
}

use_custom_private_keys

Отображаемое имя: Использует пользовательские закрытые ключи.

Описание. Использует закрытые ключи из файла ключей JSON для криптографических операций.

Конфигурация: список разрешенных идентификаторов ключей. Идентификаторы должны соответствовать ключам в файле ключей JSON, на который ссылается переменная среды SGTM_CREDENTIALS на сервере.

Требуется: hmacSha256

Подпись запроса: queryPermission('use_custom_private_keys', <key id>)

Примечания: Управляет списком разрешенных закрытых ключей.

Пример кода

const hmacSha256= require('hmacSha256');
const queryPermission = require('queryPermission');
const keyId = 'key1';

let result;
if (queryPermission('use_custom_private_keys', keyId)) {
  result = hmacSha256('my_data', keyId);
}

use_google_credentials

Отображаемое имя: использует учетные данные приложения Google по умолчанию.

Описание. Использует учетные данные Google по умолчанию для вызовов API Google.

Конфигурация: список разрешенных областей действия Google OAuth 2.0 .

Требуется: getGoogleAuth

Сигнатура запроса: queryPermission('use_google_credentials', <scopes>)

Примечания. Ограничивает разрешенные области действия Google OAuth 2.0 для использования с API Google.

Пример кода

const getGoogleAuth = require('getGoogleAuth');
const queryPermission = require('queryPermission');

const scopes = [
  'https://www.googleapis.com/auth/datastore'
];

let auth;
if (queryPermission('use_google_credentials', scopes)) {
  auth = getGoogleAuth(scopes);
}