This document outlines the permissions for server-side custom templates.
Each permission is:
- Checked by APIs that require them.
- Automatically detected in sandboxed JavaScript, based on what APIs are used. This happens as edits are made in the custom template editor (for a fast feedback loop), and when code is compiled (to validate that the correct permissions are enforced).
- Editable in the custom template editor, to make the permission more specific.
- Queryable in sandboxed JavaScript via the
queryPermission
API.
access_bigquery
Display name:Accesses BigQuery
Description:Allows access to BigQuery on Google Cloud Platform.
Configuration:Option to allow specified project, dataset, and table
combinations to be used with BigQuery. Setting a project ID configuration of GOOGLE_CLOUD_PROJECT
will allow using the GOOGLE_CLOUD_PROJECT
environment
variable as the project ID when projectId
is excluded from the BigQuery API
parameter
.
Required by: BigQuery
Query signature: queryPermission('access_bigquery', <operation>, <options>)
Notes: <operation>
is a string and can have the following values:
- write
<options>
is an object containing the following items:
{
'projectId'
:
< project_id
> ,
'datasetId'
:
< dataset_id
> ,
'tableId'
:
< table_id
> }
Example code
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 Google Firestore
Description:Allows access to Google Firestore.
Configuration:Option to allow specified project and path (wildcard syntax
supported) combinations to be used with Firestore. Setting a project ID
configuration of GOOGLE_CLOUD_PROJECT
will allow using the GOOGLE_CLOUD_PROJECT
environment variable as the project ID when projectId
is excluded from the Firestore API parameter
.
Required by: Firestore
Query signature: queryPermission('access_firestore', <operation>, <options>)
Notes: <operation>
is a string and can have the following values:
- read - Grants access to read and query APIs
- write - Grants access to write API
- read_write - Grants access to read, write, and query APIs
<options>
is an object containing the following items:
{
'projectId'
:
< project_id
> ,
'path'
:
< path
> }
Example code
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
Display name:Accesses response
Description:Accesses the response body, headers, or status.
Configuration:Option to allow any or specific access, with sub-options for controlling access to various subcomponents.
Required by: setPixelResponse
, setResponseBody
, setResponseHeader
, setResponseStatus
Query signature: queryPermission('access_response', 'write', <component>[, <optional component name>])
Notes:Governs whether the outgoing HTTP response component can be accessed.
Example code
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
Display name:Accesses Template Storage
Description:Allows access to temporary storage for templates that can persist for the lifetime of the server-side process.
Configuration:None
Required by: templateDataStorage
Query signature: queryPermission('access_template_storage')
Example code
const
queryPermission
=
require
(
'queryPermission'
);
const
templateDataStorage
=
require
(
'templateDataStorage'
);
const
key
=
'my_key'
;
if
(
queryPermission
(
'access_template_storage'
))
{
const
value
=
templateDataStorage
.
getItemCopy
(
key
);
}
get_cookies
Display name:Reads cookie value(s)
Description:Reads the values of the cookies with the specified name.
Configuration:List of names of cookies permitted for reading.
Required by: getCookieValues
Query signature: queryPermission('get_cookies', <name>)
Notes:Governs whether a cookie can be read, depending on its name.
Example code
const
queryPermission
=
require
(
'queryPermission'
);
const
getCookieValues
=
require
(
'getCookieValues'
);
const
cookieName
=
'info'
;
let
cookieValues
;
if
(
queryPermission
(
'get_cookies'
,
cookieName
))
{
cookieValues
=
getCookieValues
(
cookieName
);
}
logging
Display name:Logs to console
Description:Logs to the developer console and Tag Manager's preview mode.
Configuration:Option to enable logging in production. Defaults to only
enable logging in debug/preview. If permission is denied, logToConsole
will
not throw an error, but will suppress the log message.
Required by: logToConsole
Query signature: queryPermission('logging')
Notes:Controls whether a custom template can log to the developer console.
Example code
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
Display name:Uses messages
Description:Sends or receives messages using the addMessageListener
or sendMessage
APIs.
Configuration:Option to specify the message type and whether the template can listen, send, or both.
Required by: addMessageListener
, sendMessage
Query signature: queryPermission('use_message', <usage>, <message type>)
Notes:Usage can be one of listen
, send
, or listen_and_send
.
Example code
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
Display name:Reads container data
Description:Reads data about the container.
Configuration:None.
Required by: getClientName
, getContainerVersion
Query signature: queryPermission('read_container_data')
Notes:Controls whether a custom template can read container data.
Example code
const
getContainerVersion
=
require
(
'getContainerVersion'
);
const
queryPermission
=
require
(
'queryPermission'
);
if
(
queryPermission
(
'read_container_data'
))
{
return
getContainerVersion
();
}
read_event_data
Display name:Reads event data
Description:Reads data from the event.
Configuration:Option to allow any access, or specific access controlled by a list of allowed key paths (wildcard syntax supported).
Required by: getAllEventData
, getEventData
Query signature: queryPermission('read_event_data'[, <optional key>])
Notes:Controls whether a custom template can read event data at a given key path (or all the event data, if no key path is given).
Example code
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
Display name:Reads event metadata
Description:Reads event metadata in Event Callbacks
Configuration:None
Required by: addEventCallback
Query signature: queryPermission('read_event_metadata')
Notes:Controls whether a custom template can read event metadata in callbacks.
Example code
const
queryPermission
=
require
(
'queryPermission'
);
const
addEventCallback
=
require
(
'addEventCallback'
);
if
(
queryPermission
(
'read_event_metadata'
))
{
addEventCallback
((
containerId
,
eventMetadata
)
=
>
{
// Read event metadata.
});
}
read_request
Display name:Reads HTTP request
Description:Reads the request headers, query parameters, body, path, or remote IP address.
Configuration:Option to allow any or specific access, with sub-options for controlling access to various subcomponents.
Required by: extractEventsFromMpv1
, extractEventsFromMpv2
, getRemoteAddress
, getRequestBody
, getRequestHeader
, getRequestPath
, getRequestQueryParameter
, getRequestQueryParameters
, getRequestQueryString
Query signature: queryPermission('read_request', <component>[, <optional component name>])
Notes:Governs whether the incoming HTTP response component can be accessed.
Example code
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
Display name:Returns response
Description:Returns response to the caller.
Configuration:None
Required by: returnResponse
Query signature: queryPermission('return_response')
Notes:This permission has no fields to narrow, and is typically not queried for.
run_container
Display name:Runs the container
Description:Runs the container with an event
Configuration:None
Required by: runContainer
Query signature: queryPermission('run_container')
Notes:This permission has no fields to narrow, and is typically not queried for.
send_http
Display name:Sends HTTP requests
Description:Sends an HTTP request to a specified URL.
Required by: getGoogleScript
, sendEventToGoogleAnalytics
, sendHttpGet
, sendHttpRequest
Query signature: queryPermission('send_http', <url>)
Notes:Governs whether an HTTP request can be made, depending on the URL. To ensure a secure connection, only secure (HTTPS) URLs are permitted.
Example code
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
Display name:Sends pixels from browsers
Description:Sends a GET request to a specified URL from the browser.
Required by: sendPixelFromBrowser
Query signature: queryPermission('send_pixel_from_browser', <url>)
Notes:Governs whether a request can be sent from the browser, depending on the URL.
Example code
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
Display name:Sets a cookie
Description:Sets a cookie with the specified name and parameters.
Configuration:A table of allowed cookie names, each with optional
restrictions on name, domain, path, secure
attribute, and expiration.
Required by: setCookie
Query signature: queryPermission('set_cookies', <name>, <options>)
Notes:Governs whether a given 'Set-Cookie' header can be added to the
response, depending on the cookie name, domain, path, secure
attribute, and
expiration.
Example code
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
Display name:Uses custom private keys
Description:Uses private keys from a JSON key file for cryptographic operations.
Configuration:A list of allowed key IDs. The IDs must match the keys in
the JSON key file referenced by the SGTM_CREDENTIALS
environment variable
on the server.
Required by: hmacSha256
Query signature: queryPermission('use_custom_private_keys', <key id>)
Notes:Governs the list of allowed private keys.
Example code
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
Display name:Uses Google Application Default Credentials
Description:Uses the Google default credentials to make calls to Google APIs.
Configuration:A list of allowed Google OAuth 2.0 scopes .
Required by: getGoogleAuth
Query signature: queryPermission('use_google_credentials', <scopes>)
Notes:Restricts the allowed Google OAuth 2.0 scopes for use with Google APIs.
Example code
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
);
}