Izin template kustom sisi server

Dokumen ini berisi penjelasan tentang izin untuk template kustom sisi server.


Setiap izin:

  • Diperiksa oleh API yang mewajibkannya.
  • Terdeteksi secara otomatis dalam JavaScript dengan sandbox, berdasarkan API yang digunakan. Hal ini terjadi saat pengeditan dilakukan di editor template kustom (untuk feedback loop yang cepat), dan saat kode dikompilasi (untuk memvalidasi bahwa izin yang benar telah diterapkan).
  • Dapat diedit di editor template kustom, untuk menjadikan izin lebih spesifik.
  • Dapat dikueri dalam JavaScript dengan sandbox melalui API queryPermission.

access_bigquery

Nama tampilan: Mengakses BigQuery

Deskripsi: Mengizinkan akses ke BigQuery di Google Cloud Platform.

Konfigurasi: Opsi untuk mengizinkan kombinasi project, set data, dan tabel yang ditentukan untuk digunakan dengan BigQuery. Penetapan konfigurasi project ID GOOGLE_CLOUD_PROJECT akan mengizinkan penggunaan variabel lingkungan GOOGLE_CLOUD_PROJECT sebagai project ID saat projectId dikecualikan dari BigQuery API parameter.

Diwajibkan oleh: BigQuery

Signature kueri: queryPermission('access_bigquery', <operation>, <options>)

Catatan: <operation> adalah string dan dapat memiliki nilai berikut:

  • write

<options> adalah objek yang berisi item berikut:

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

Kode contoh

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

Nama tampilan: Mengakses Google Firestore

Deskripsi: Mengizinkan akses ke Google Firestore.

Konfigurasi: Opsi untuk mengizinkan kombinasi project dan jalur yang ditentukan (sintaksis karakter pengganti didukung) untuk digunakan dengan Firestore. Penetapan konfigurasi project ID GOOGLE_CLOUD_PROJECT akan mengizinkan penggunaan variabel lingkungan GOOGLE_CLOUD_PROJECT sebagai project ID saat projectId dikecualikan dari Firestore API parameter.

Diwajibkan oleh: Firestore

Signature kueri: queryPermission('access_firestore', <operation>, <options>)

Catatan: <operation> adalah string dan dapat memiliki nilai berikut:

  • read - Memberikan akses untuk membaca dan meng-kueri API
  • write - Memberikan akses untuk menulis API
  • read_write - Memberikan akses untuk membaca, menulis, dan meng-kueri API

<options> adalah objek yang berisi item berikut:

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

Kode contoh

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

Nama tampilan: Mengakses respons

Deskripsi: Mengakses isi, header, atau status respons.

Konfigurasi: Opsi untuk mengizinkan akses apa pun atau akses tertentu, dengan sub-opsi untuk mengontrol akses ke berbagai subkomponen.

Diwajibkan oleh: setPixelResponse, setResponseBody, setResponseHeader, setResponseStatus

Signature kueri: queryPermission('access_response', 'write', <component>[, <optional component name>])

Catatan: Mengatur apakah komponen respons HTTP keluar dapat diakses.

Kode contoh

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

Nama tampilan: Mengakses Penyimpanan Template

Deskripsi: Mengizinkan akses ke penyimpanan sementara untuk template yang dapat dipertahankan di sepanjang waktu proses sisi server.

Konfigurasi: Tidak ada

Diwajibkan oleh: templateDataStorage

Signature kueri: queryPermission('access_template_storage')

Kode contoh

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

get_cookies

Nama tampilan: Membaca nilai cookie

Deskripsi: Membaca nilai cookie dengan nama yang ditentukan.

Konfigurasi: Daftar nama cookie yang diizinkan untuk dibaca.

Diwajibkan oleh: getCookieValues

Signature kueri: queryPermission('get_cookies', <name>)

Catatan: Mengatur apakah cookie dapat dibaca, bergantung pada namanya.

Kode contoh

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

logging

Nama tampilan: Logging untuk konsol

Deskripsi: Logging untuk konsol developer and dan mode pratinjau Tag Manager.

Konfigurasi: Opsi untuk mengaktifkan logging dalam produksi. Setelan defaultnya hanya mengaktifkan logging di debug/pratinjau. Jika izin ditolak, logToConsole tidak akan menampilkan error, tetapi akan menyembunyikan pesan log.

Diwajibkan oleh: logToConsole

Signature kueri: queryPermission('logging')

Catatan: Mengontrol apakah template kustom dapat melakukan logging ke konsol developer.

Kode contoh

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

Nama tampilan: Menggunakan pesan

Deskripsi: Mengirim atau menerima pesan menggunakan API addMessageListener atau sendMessage.

Konfigurasi: Opsi untuk menentukan jenis pesan dan apakah template dapat memproses, mengirim, atau melakukan keduanya.

Diwajibkan oleh: addMessageListener, sendMessage

Signature kueri: queryPermission('use_message', <usage>, <message type>)

Catatan: Penggunaan dapat berupa salah satu dari listen, send, atau listen_and_send.

Kode contoh

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

Nama tampilan: Membaca data penampung

Deskripsi: Membaca data tentang penampung.

Konfigurasi: Tidak ada.

Diwajibkan oleh: getClientName, getContainerVersion

Signature kueri: queryPermission('read_container_data')

Catatan: Mengontrol apakah template kustom dapat membaca data penampung.

Kode contoh

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

read_event_data

Nama tampilan: Membaca data peristiwa

Deskripsi: Membaca data dari peristiwa.

Konfigurasi: Opsi untuk mengizinkan akses apa pun, atau akses tertentu yang dikontrol oleh daftar jalur kunci yang diizinkan (sintaksis karakter pengganti didukung).

Diwajibkan oleh: getAllEventData, getEventData

Signature kueri: queryPermission('read_event_data'[, <optional key>])

Catatan: Mengontrol apakah template kustom dapat membaca data peristiwa di jalur kunci tertentu (atau semua data peristiwa, jika tidak ada jalur kunci yang diberikan).

Kode contoh

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

Nama tampilan: Membaca metadata peristiwa

Deskripsi: Membaca metadata peristiwa di Callback Peristiwa

Konfigurasi: Tidak ada

Diwajibkan oleh: addEventCallback

Signature kueri: queryPermission('read_event_metadata')

Catatan: Mengontrol apakah template kustom dapat membaca metadata peristiwa di callback.

Kode contoh

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

read_request

Nama tampilan: Membaca permintaan HTTP

Deskripsi: Membaca header permintaan, parameter kueri, isi, jalur, atau alamat IP jarak jauh.

Konfigurasi: Opsi untuk mengizinkan akses apa pun atau akses tertentu, dengan sub-opsi untuk mengontrol akses ke berbagai subkomponen.

Diwajibkan oleh: extractEventsFromMpv1, extractEventsFromMpv2, getRemoteAddress, getRequestBody, getRequestHeader, getRequestPath, getRequestQueryParameter, getRequestQueryParameters, getRequestQueryString

Signature kueri: queryPermission('read_request', <component>[, <optional component name>])

Catatan: Mengatur apakah komponen respons HTTP yang masuk dapat diakses.

Kode contoh

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

Nama tampilan: Menampilkan respons

Deskripsi: Menampilkan respons kepada pemanggil.

Konfigurasi: Tidak ada

Diwajibkan oleh: returnResponse

Signature kueri: queryPermission('return_response')

Catatan: Izin ini tidak memiliki kolom untuk dipersempit, dan biasanya tidak dikueri.

run_container

Nama tampilan: Menjalankan penampung

Deskripsi: Menjalankan penampung dengan peristiwa

Konfigurasi: Tidak ada

Diwajibkan oleh: runContainer

Signature kueri: queryPermission('run_container')

Catatan: Izin ini tidak memiliki kolom untuk dipersempit, dan biasanya tidak dikueri.

send_http

Nama tampilan: Mengirim permintaan HTTP

Deskripsi: Mengirim permintaan HTTP ke URL tertentu.

Diwajibkan oleh: getGoogleScript, sendEventToGoogleAnalytics, sendHttpGet, sendHttpRequest

Signature kueri: queryPermission('send_http', <url>)

Catatan: Mengatur apakah permintaan HTTP dapat dibuat, bergantung pada URL. Untuk memastikan koneksi aman, hanya URL (HTTPS) aman yang diizinkan.

Kode contoh

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

Nama tampilan: Mengirim piksel dari browser

Deskripsi: Mengirim permintaan GET ke URL yang ditentukan dari browser.

Diwajibkan oleh: sendPixelFromBrowser

Signature kueri: queryPermission('send_pixel_from_browser', <url>)

Catatan: Mengatur apakah permintaan dapat dikirim dari browser, bergantung pada URL.

Kode contoh

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

Nama tampilan: Menetapkan cookie

Deskripsi: Menetapkan cookie dengan nama dan parameter yang ditentukan.

Konfigurasi: Tabel nama cookie yang diizinkan, masing-masing dengan pembatasan opsional pada nama, domain, jalur, atribut secure, dan masa berlaku.

Diwajibkan oleh: setCookie

Signature kueri: queryPermission('set_cookies', <name>, <options>)

Catatan: Mengatur apakah header 'Set-Cookie' tertentu dapat ditambahkan ke respons, bergantung pada nama cookie, domain, jalur, atribut secure, dan masa berlaku.

Kode contoh

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

Nama tampilan: Menggunakan kunci pribadi kustom

Deskripsi: Menggunakan kunci pribadi dari file kunci JSON untuk operasi kriptografi.

Konfigurasi: Daftar ID kunci yang diizinkan. ID harus cocok dengan kunci dalam file kunci JSON yang dirujuk oleh variabel lingkungan SGTM_CREDENTIALS di server.

Diwajibkan oleh: hmacSha256

Signature kueri: queryPermission('use_custom_private_keys', <key id>)

Catatan: Mengatur daftar kunci pribadi yang diizinkan.

Kode contoh

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

Nama tampilan: Menggunakan Kredensial Default Aplikasi Google

Deskripsi: Menggunakan kredensial default Google untuk melakukan panggilan ke Google API.

Konfigurasi: Daftar cakupan Google OAuth 2.0 yang diizinkan.

Diwajibkan oleh: getGoogleAuth

Signature kueri: queryPermission('use_google_credentials', <scopes>)

Catatan: Membatasi cakupan Google OAuth 2.0 yang diizinkan untuk digunakan dengan Google API.

Kode contoh

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