Разрешения для серверных пользовательских шаблонов

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


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

  • проверяется тем 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> – строковый параметр, который может принимать следующие значения:

  • write

<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);
}

logging

Отображаемое название: "Вывод на консоль".

Описание: записывает сообщения в консоли разработчика и в режиме предварительного просмотра Менеджера тегов.

Параметры: вы можете выводить данные в рабочей версии. По умолчанию журнал ведется только в режиме отладки (предварительного просмотра). Если не предоставить разрешение, 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>).

Примечание: на основе URL определяет, можно ли отправить HTTP-запрос. С целью обеспечения безопасного подключения поддерживаются только 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", основываясь на имени, домене, пути, атрибуте secure и сроке действия файла cookie.

Пример кода

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 Application Default Credentials".

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

Настройки: список допустимых областей действия 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);
}

user_ip

Отображаемое название: "Чтение IP-адреса пользователя".

Описание. Чтение IP-адреса пользователя.

Настройки: нет.

Требуется: для getAnonymizedIpAddress.

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

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

Пример кода

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

if (queryPermission('user_ip')) {
  return getAnonymizedIpAddress();
}