สิทธิ์เทมเพลตที่กำหนดเองฝั่งเซิร์ฟเวอร์

เอกสารนี้สรุปสิทธิ์สำหรับเทมเพลตที่กำหนดเองฝั่งเซิร์ฟเวอร์


สิทธิ์แต่ละรายการมีลักษณะดังนี้

  • ตรวจสอบโดย API ที่ต้องใช้
  • ตรวจพบโดยอัตโนมัติใน JavaScript ที่ใช้แซนด์บ็อกซ์ โดยอิงตาม API ที่ใช้ ซึ่งจะเกิดขึ้นเมื่อมีการแก้ไขในเครื่องมือแก้ไขเทมเพลตที่กำหนดเอง (สำหรับลูปความคิดเห็นที่รวดเร็ว) และเมื่อคอมไพล์โค้ด (เพื่อตรวจสอบว่ามีการบังคับใช้สิทธิ์ที่ถูกต้อง)
  • แก้ไขได้ในเครื่องมือแก้ไขเทมเพลตที่กำหนดเอง เพื่อให้สิทธิ์มีความเฉพาะเจาะจงมากขึ้น
  • ค้นหาได้ใน JavaScript ที่ใช้แซนด์บ็อกซ์ผ่าน queryPermission API

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

ชื่อที่แสดง: อ่านค่าคุกกี้

คำอธิบาย: อ่านค่าของคุกกี้ด้วยชื่อที่ระบุไว้แล้ว

การกำหนดค่า: รายชื่อคุกกี้ที่อนุญาตให้อ่าน

ต้องดำเนินการภายในวันที่: getCookieValues

ลายเซ็นการค้นหา: queryPermission('get_cookies', <name>)

หมายเหตุ: ควบคุมว่าจะอ่านคุกกี้ได้หรือไม่ โดยขึ้นอยู่กับชื่อของคุกกี้

โค้ดตัวอย่าง

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

การบันทึก

ชื่อที่แสดง: บันทึกไปที่คอนโซล

คำอธิบาย: บันทึกข้อมูลไปยังคอนโซลของนักพัฒนาซอฟต์แวร์และโหมดแสดงตัวอย่างของ Tag Manager

การกำหนดค่า: ตัวเลือกในการเปิดใช้การบันทึกในเวอร์ชันที่ใช้งานจริง ค่าเริ่มต้นคือเปิดใช้การบันทึกในการแก้ไขข้อบกพร่อง/แสดงตัวอย่างเท่านั้น หากสิทธิ์ถูกปฏิเสธ 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

การกำหนดค่า: ตัวเลือกในการระบุประเภทข้อความ และระบุว่าเทมเพลตจะฟัง ส่ง หรือทั้ง 2 อย่างได้หรือไม่

ต้องดำเนินการภายในวันที่: 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

ชื่อที่แสดง: อ่านข้อมูลเมตาของเหตุการณ์

คำอธิบาย: อ่านข้อมูลเมตาของเหตุการณ์ใน Callback ของเหตุการณ์

การกำหนดค่า: ไม่มี

ต้องดำเนินการภายในวันที่: addEventCallback

ลายเซ็นการค้นหา: queryPermission('read_event_metadata')

หมายเหตุ: ควบคุมว่าเทมเพลตที่กำหนดเองจะอ่านข้อมูลเมตาของเหตุการณ์ใน Callback ได้หรือไม่

โค้ดตัวอย่าง

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

ชื่อที่แสดง: Returns 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

ชื่อที่แสดง: ตั้งค่าคุกกี้

คำอธิบาย: ตั้งค่าคุกกี้โดยใช้ชื่อและพารามิเตอร์ที่ระบุ

การกำหนดค่า: ตารางชื่อคุกกี้ที่อนุญาต โดยแต่ละชื่อจะมีข้อจำกัดที่ไม่บังคับเกี่ยวกับชื่อ โดเมน เส้นทาง แอตทริบิวต์ secure และวันหมดอายุ

ต้องดำเนินการภายในวันที่: setCookie

ลายเซ็นการค้นหา: queryPermission('set_cookies', <name>, <options>)

หมายเหตุ: ควบคุมว่าจะเพิ่มส่วนหัว "Set-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 ในการเรียก Google APIs

การกำหนดค่า: รายการขอบเขต Google OAuth 2.0 ที่อนุญาต

ต้องดำเนินการภายในวันที่: getGoogleAuth

ลายเซ็นการค้นหา: queryPermission('use_google_credentials', <scopes>)

หมายเหตุ: จำกัดขอบเขต Google OAuth 2.0 ที่อนุญาตให้ใช้กับ Google API

โค้ดตัวอย่าง

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