В этом документе описываются разрешения для настраиваемых шаблонов на стороне сервера.
Каждое разрешение:
- Проверено 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);
}
доступ_ответ
Отображаемое имя: Доступ к ответу
Описание: доступ к телу ответа, заголовкам или статусу.
Конфигурация: возможность разрешить любой или конкретный доступ с подопциями для управления доступом к различным подкомпонентам.
Требуется: 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-адреса. Для обеспечения безопасного соединения разрешены только безопасные (HTTPS) URL-адреса.
Пример кода
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);
}