Uprawnienia do szablonów niestandardowych po stronie serwera

W tym dokumencie opisujemy uprawnienia dotyczące szablonów niestandardowych po stronie serwera.


Każde uprawnienie jest:

  • Sprawdzane przez interfejsy API, które ich wymagają.
  • Wykrywane automatycznie w odizolowanym JavaScript na podstawie używanych interfejsów API. Dzieje się tak, gdy zmiany są wprowadzane w edytorze szablonów niestandardowych (w celu szybkiego uzyskania pętli informacji zwrotnych) oraz podczas kompilowania kodu (w celu sprawdzenia, czy są egzekwowane prawidłowe uprawnienia).
  • Można je edytować w edytorze szablonów niestandardowych, aby uprawnienia były bardziej szczegółowe.
  • Można wysyłać zapytania w odizolowanym JavaScriptzie za pomocą interfejsu API queryPermission.

access_bigquery

Wyświetlana nazwa: Accesses BigQuery

Opis: umożliwia dostęp do BigQuery na Google Cloud Platform.

Konfiguracja: opcja umożliwiająca używanie określonych kombinacji projektów, zbiorów danych i tabel w BigQuery. Ustawienie konfiguracji identyfikatora projektu na GOOGLE_CLOUD_PROJECT umożliwi używanie zmiennej środowiskowej GOOGLE_CLOUD_PROJECT jako identyfikatora projektu, gdy projectId zostanie wykluczony z BigQuery API parameter.

Wymagane przez: BigQuery

Sygnatura zapytania: queryPermission('access_bigquery', <operation>, <options>)

Uwagi: <operation> to ciąg znaków, który może mieć te wartości:

  • zapis

<options> to obiekt zawierający te elementy:

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

Przykładowy kod

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

Wyświetlana nazwa: Dostęp do Google Firestore

Opis: umożliwia dostęp do Google Firestore.

Konfiguracja: opcja umożliwiająca używanie z Firestore określonych kombinacji projektów i ścieżek (obsługiwana jest składnia symboli wieloznacznych). Ustawienie konfiguracji identyfikatora projektu na GOOGLE_CLOUD_PROJECT umożliwi używanie zmiennej środowiskowej GOOGLE_CLOUD_PROJECT jako identyfikatora projektu, gdy projectId zostanie wykluczony z Firestore API parameter.

Wymagane przez: Firestore

Podpis zapytania: queryPermission('access_firestore', <operation>, <options>)

Uwagi: <operation> to ciąg znaków, który może mieć te wartości:

  • read – przyznaje dostęp do interfejsów API do odczytu i zapytań,
  • write – przyznaje dostęp do interfejsu API zapisu,
  • read_write – przyznaje uprawnienia do odczytu, zapisu i wysyłania zapytań do interfejsów API

<options> to obiekt zawierający te elementy:

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

Przykładowy kod

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

Wyświetlana nazwa: Dostęp do odpowiedzi

Opis: dostęp do treści, nagłówków i stanu odpowiedzi.

Konfiguracja: opcja zezwalająca na dowolny lub określony dostęp, z podopcjami umożliwiającymi kontrolowanie dostępu do różnych podkomponentów.

Wymagane przez: setPixelResponse, setResponseBody, setResponseHeader, setResponseStatus

Podpis zapytania: queryPermission('access_response', 'write', <component>[, <optional component name>])

Uwagi: określa, czy można uzyskać dostęp do wychodzącego komponentu odpowiedzi HTTP.

Przykładowy kod

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

Wyświetlana nazwa: Dostęp do pamięci szablonów

Opis: umożliwia dostęp do tymczasowego miejsca na dane dla szablonów, które mogą być przechowywane przez cały czas trwania procesu po stronie serwera.

Konfiguracja: brak

Wymagane przez: templateDataStorage

Sygnatura zapytania: queryPermission('access_template_storage')

Przykładowy kod

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

get_cookies

Wyświetlana nazwa: Odczyt wartości plików cookie

Opis: odczytuje wartości plików cookie o określonych nazwach.

Konfiguracja: lista nazw plików cookie, które można odczytywać.

Wymagane przez: getCookieValues

Sygnatura zapytania: queryPermission('get_cookies', <name>)

Uwagi: określa, czy plik cookie może być odczytywany, w zależności od jego nazwy.

Przykładowy kod

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

logowanie

Wyświetlana nazwa: Logowanie do konsoli

Opis: logowanie się do konsoli programisty i trybu podglądu Menedżera tagów.

Konfiguracja: opcja umożliwiająca włączenie logowania w środowisku produkcyjnym. Domyślnie logowanie jest włączone tylko w trybie debugowania/podglądu. Jeśli uprawnienia zostaną odrzucone, logToConsole nie zgłosi błędu, ale komunikat logu zostanie pominięty.

Wymagane przez: logToConsole

Sygnatura zapytania: queryPermission('logging')

Uwagi: określa, czy szablon niestandardowy może zapisywać dane w konsoli programisty.

Przykładowy kod

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

Wyświetlana nazwa: Korzystanie z wiadomości

Opis: wysyła lub odbiera wiadomości za pomocą interfejsów API addMessageListener lub sendMessage.

Konfiguracja: opcja określenia typu wiadomości i tego, czy szablon może nasłuchiwać, wysyłać czy wykonywać obie te czynności.

Wymagane przez: addMessageListener, sendMessage

Sygnatura zapytania: queryPermission('use_message', <usage>, <message type>)

Uwagi: użycie może być jednym z tych: listen, send lub listen_and_send.

Przykładowy kod

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

Wyświetlana nazwa: Odczyt danych kontenera

Opis: odczyt danych o kontenerze.

Konfiguracja: brak.

Wymagane przez: getClientName, getContainerVersion

Sygnatura zapytania: queryPermission('read_container_data')

Uwagi: określa, czy szablon niestandardowy może odczytywać dane kontenera.

Przykładowy kod

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

read_event_data

Wyświetlana nazwa: Odczyt danych zdarzenia

Opis: odczytuje dane ze zdarzenia.

Konfiguracja: opcja zezwalająca na dowolną kontrolę dostępu lub określoną kontrolę dostępu kontrolowaną przez listę dozwolonych ścieżek kluczy (obsługiwana jest składnia symboli wieloznacznych).

Wymagane przez: getAllEventData, getEventData

Sygnatura zapytania: queryPermission('read_event_data'[, <optional key>])

Uwagi: określa, czy szablon niestandardowy może odczytywać dane zdarzenia w podanej ścieżce klucza (lub wszystkie dane zdarzenia, jeśli nie podano ścieżki klucza).

Przykładowy kod

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

Wyświetlana nazwa: odczyt metadanych zdarzenia

Opis: odczyt metadanych zdarzenia w wywołaniach zwrotnych zdarzenia.

Konfiguracja: brak

Wymagane przez: addEventCallback

Sygnatura zapytania: queryPermission('read_event_metadata')

Uwagi: określa, czy szablon niestandardowy może odczytywać metadane zdarzenia w wywołaniach zwrotnych.

Przykładowy kod

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

read_request

Wyświetlana nazwa: Odczytuje żądanie HTTP

Opis: odczytuje nagłówki żądania, parametry zapytania, treść, ścieżkę lub zdalny adres IP.

Konfiguracja: opcja zezwalająca na dowolny lub określony dostęp, z podopcjami umożliwiającymi kontrolowanie dostępu do różnych podkomponentów.

Wymagane przez: extractEventsFromMpv1, extractEventsFromMpv2, getRemoteAddress, getRequestBody, getRequestHeader, getRequestPath, getRequestQueryParameter, getRequestQueryParameters, getRequestQueryString

Sygnatura zapytania: queryPermission('read_request', <component>[, <optional component name>])

Uwagi: określa, czy można uzyskać dostęp do komponentu przychodzącej odpowiedzi HTTP.

Przykładowy kod

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

Wyświetlana nazwa: Returns response

Opis: zwraca odpowiedź elementowi wywołującemu.

Konfiguracja: brak

Wymagane przez: returnResponse

Sygnatura zapytania: queryPermission('return_response')

Uwagi: to uprawnienie nie ma pól do zawężenia i zwykle nie jest wyszukiwane.

run_container

Wyświetlana nazwa: Powoduje uruchomienie kontenera

Opis: powoduje uruchomienie kontenera ze zdarzeniem.

Konfiguracja: brak

Wymagane przez: runContainer

Sygnatura zapytania: queryPermission('run_container')

Uwagi: to uprawnienie nie ma pól do zawężenia i zwykle nie jest wyszukiwane.

send_http

Wyświetlana nazwa: Wysyłanie żądań HTTP

Opis: wysyła żądanie HTTP na określony adres URL.

Wymagane przez: getGoogleScript, sendEventToGoogleAnalytics, sendHttpGet, sendHttpRequest

Sygnatura zapytania: queryPermission('send_http', <url>)

Uwagi: określa, czy można wysłać żądanie HTTP, w zależności od adresu URL. Aby zapewnić bezpieczne połączenie, dozwolone są tylko bezpieczne adresy URL (HTTPS).

Przykładowy kod

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

Wyświetlana nazwa: wysyłanie pikseli z przeglądarek

Opis: wysyła żądanie GET do określonego adresu URL z przeglądarki.

Wymagane przez: sendPixelFromBrowser

Sygnatura zapytania: queryPermission('send_pixel_from_browser', <url>)

Uwagi: określa, czy żądanie może zostać wysłane z przeglądarki, w zależności od adresu URL.

Przykładowy kod

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

Wyświetlana nazwa: Ustawianie pliku cookie

Opis: konfiguruje plik cookie z określoną nazwą i wybranymi parametrami.

Konfiguracja: tabela dozwolonych nazw plików cookie, z których każda ma opcjonalne ograniczenia dotyczące nazwy, domeny, ścieżki, atrybutu secure i daty ważności.

Wymagane przez: setCookie

Sygnatura zapytania: queryPermission('set_cookies', <name>, <options>)

Uwagi: określa, czy dany nagłówek „Set-Cookie” może zostać dodany do odpowiedzi, w zależności od nazwy pliku cookie, domeny, ścieżki, atrybutu secure i daty ważności.

Przykładowy kod

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

Wyświetlana nazwa: Używanie niestandardowych kluczy prywatnych

Opis: używanie kluczy prywatnych z pliku kluczy JSON na potrzeby operacji kryptograficznych.

Konfiguracja: lista dozwolonych identyfikatorów kluczy. Identyfikatory muszą być zgodne z kluczami w pliku kluczy JSON, do którego odwołuje się zmienna środowiskowa SGTM_CREDENTIALS na serwerze.

Wymagane przez: hmacSha256

Sygnatura zapytania: queryPermission('use_custom_private_keys', <key id>)

Uwagi: określa listę dozwolonych kluczy prywatnych.

Przykładowy kod

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

Wyświetlana nazwa: Używanie domyślnego uwierzytelniania aplikacji Google

Opis: używanie domyślnych danych logowania Google do wywoływania interfejsów API Google.

Konfiguracja: lista dozwolonych zakresów Google OAuth 2.0.

Wymagane przez: getGoogleAuth

Sygnatura zapytania: queryPermission('use_google_credentials', <scopes>)

Uwagi: ogranicza dozwolone zakresy Google OAuth 2.0 do użycia z interfejsami API Google.

Przykładowy kod

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

Wyświetlana nazwa: Odczyt adresu IP użytkownika

Opis: odczytuje adres IP użytkownika.

Konfiguracja: brak

Wymagane przez: getAnonymizedIpAddress

Sygnatura zapytania: queryPermission('user_ip')

Uwagi: określa, czy szablon niestandardowy może odczytywać adres IP użytkownika.

Przykładowy kod

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

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