サーバー側カスタム テンプレートのアクセス権

このドキュメントでは、サーバーサイド カスタム テンプレートの権限について説明します。


各権限は…

  • その権限を要求する API によってチェックされます。
  • サンドボックス化された JavaScript から、使用されている API に応じて自動検出されます。検出処理は、カスタム テンプレート エディタでの編集時(迅速なフィードバック ループを実現するため)と、コードのコンパイル時(適切な権限が適用されていることを検証するため)に行われます。
  • カスタム テンプレート エディタ内で編集して、権限をより具体的に指定できるようになっています。
  • queryPermission API により、サンドボックス化された JavaScript 内でクエリ可能です。

access_bigquery

表示名: Accesses BigQuery

説明: Google Cloud Platform 上で BigQuery へのアクセスを許可します。

設定: BigQuery 上で、指定されたプロジェクト、データセット、テーブルの組み合わせの使用を許可するオプション。プロジェクト ID 設定を GOOGLE_CLOUD_PROJECT にすると、projectIdBigQuery API parameter から除外されている場合に、環境変数 GOOGLE_CLOUD_PROJECT をプロジェクト ID として使用できます。

要求元: 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

Display name: Accesses Firestore

説明: Google Firestore へのアクセスを許可します。

設定: 指定されたプロジェクトとパス(ワイルドカード構文に対応)の組み合わせで Firebase を使用することを許可するオプション。プロジェクト ID 設定を GOOGLE_CLOUD_PROJECT にすると、projectIdFirestore API parameter から除外されている場合に、環境変数 GOOGLE_CLOUD_PROJECT をプロジェクト ID として使用できます。

要求元: 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

表示名: Accesses response

説明: レスポンスの本文、ヘッダー、ステータスにアクセスします。

設定: 許可するアクセス先を任意または個別に指定できるオプション。各種サブコンポーネントへのアクセスを制御するサブオプションが用意されています。

要求元: setPixelResponsesetResponseBodysetResponseHeadersetResponseStatus

クエリ シグネチャ: 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

表示名: Accesses 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

表示名: Reads cookie value(s)

説明: 指定した名前の Cookie の値を読み取ります。

構成: 読み取りが許可されている Cookie の名前のリスト。

要求元: getCookieValues

クエリ シグネチャ: queryPermission('get_cookies', <name>)

注: Cookie 名に基づいて、その Cookie の読み取りを許可するかどうかを制御します。

コード例

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

logging

表示名: Logs to console

説明: 開発者コンソールとタグ マネージャーのプレビューモードにログを記録します。

設定: 本番環境でのログを有効にするオプション。デフォルトでは、デバッグやプレビューでのみログを有効にします。権限が拒否された場合、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

表示名: Uses messages

説明: addMessageListener または sendMessage API を使用してメッセージを送受信します。

設定: メッセージの種類と、テンプレートに許可する処理(リッスン、送信、またはその両方)を指定するオプション。

要求元: addMessageListenersendMessage

クエリ シグネチャ: queryPermission('use_message', <usage>, <message type>)

注: 使用方法は、listensendlisten_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

表示名: Reads container data

説明: コンテナに関するデータを読み取ります。

設定: なし。

要求元: getClientNamegetContainerVersion

クエリ シグネチャ: queryPermission('read_container_data')

注: カスタム テンプレートがコンテナ データを読み取れるかどうかを制御します。

コード例

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

read_event_data

表示名: Reads event data

説明: イベントからデータを読み取ります。

設定: 許可するアクセス先を任意または個別に指定できるオプション。個別指定の場合のアクセス先は、許可されるキーパスのリスト(ワイルドカード構文に対応)によって制御します。

要求元: getAllEventDatagetEventData

クエリ シグネチャ: 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

表示名: Reads 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

表示名: Reads HTTP request

説明: リクエスト ヘッダー、クエリ パラメータ、本文、パス、またはリモート IP アドレスを読み取ります。

設定: 許可するアクセス先を任意または個別に指定できるオプション。各種サブコンポーネントへのアクセスを制御するサブオプションが用意されています。

要求元: extractEventsFromMpv1extractEventsFromMpv2getRemoteAddressgetRequestBodygetRequestHeadergetRequestPathgetRequestQueryParametergetRequestQueryParametersgetRequestQueryString

クエリ シグネチャ: 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

表示名: Runs the container

説明: イベントが指定されたコンテナを実行します。

設定: なし

要求元: runContainer

クエリ シグネチャ: queryPermission('run_container')

注: この権限には絞り込みフィールドがなく、通常はクエリの対象となりません。

send_http

表示名: Sends HTTP requests

説明: 指定された URL に HTTP リクエストを送信します。

要求元: getGoogleScriptsendEventToGoogleAnalyticssendHttpGetsendHttpRequest

クエリ シグネチャ: 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

表示名: Sends pixels from browsers

説明: 指定された URL にブラウザから GET リクエストを送信します。

要求元: 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

表示名: Sets a cookie

説明: 指定された名前とパラメータを使用して Cookie を設定します。

構成: 許可されている Cookie 名のリスト。オプションとして、名前、ドメイン、パス、secure 属性、有効期限について制限できます。

要求元: setCookie

クエリ シグネチャ: queryPermission('set_cookies', <name>, <options>)

注: Cookie 名、ドメイン、パス、secure 属性、有効期限に基づき、指定した「Set-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 キーファイル内の秘密鍵を使用します。

構成: 許可されるキー ID のリスト。ID は、サーバーの SGTM_CREDENTIALS 環境変数によって参照される JSON キーファイル内のキーと一致している必要があります。

要求元: 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

表示名: Uses Google Application Default Credentials

説明: Google のデフォルト認証情報を使用して Google API を呼び出します。

構成: 許可されている Google OAuth 2.0 スコープのリスト。

要求元: getGoogleAuth

クエリ シグネチャ: queryPermission('use_google_credentials', <scopes>)

注: Google API で使用できる Google OAuth 2.0 スコープを制限します。

コード例

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