Puedes usar el método ScriptApp.getIdentityToken() para obtener un token de identidad de OpenID Connect (un token web JSON o JWT) para el usuario efectivo. Puedes usar este token para autenticarte en los servicios de Google Cloud, como Cloud Run, que están configurados para aceptarlo.
Habilita el alcance de openid
El alcance openid es obligatorio para generar un token de ID de OpenID Connect. También debes enumerar cualquier otro alcance que use tu secuencia de comandos, como https://www.googleapis.com/auth/script.external_request para el servicio UrlFetch. El alcance https://www.googleapis.com/auth/userinfo.email se incluye en este ejemplo para agregar la dirección de correo electrónico del usuario al token de identidad.
En el archivo de manifiesto (appsscript.json) de tu proyecto de secuencia de comandos, agrega el alcance openid y cualquier otro alcance requerido al array oauthScopes:
{
"timeZone": "America/New_York",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"openid",
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/userinfo.email"
]
}
Configura el servicio de Google Cloud
Debes configurar el servicio de Google Cloud para que acepte el token de identidad emitido para tu secuencia de comandos. Por lo general, esto implica agregar el ID de cliente de la secuencia de comandos como público permitido.
Para encontrar el ID de cliente de tu secuencia de comandos, puedes decodificar un token de identidad:
function logClientId() {
const idToken = ScriptApp.getIdentityToken();
const body = idToken.split('.')[1];
const decoded = Utilities.newBlob(Utilities.base64Decode(body)).getDataAsString();
const payload = JSON.parse(decoded);
Logger.log('Client ID: ' + payload.aud);
}
En el caso de Cloud Run, puedes configurar públicos personalizados para permitir este ID de cliente.
Realiza una solicitud autenticada
Una vez que lo configures, puedes incluir el token de identidad en el encabezado Authorization de tus solicitudes:
function callCloudRunService() {
const idToken = ScriptApp.getIdentityToken();
const url = 'https://your-service-url.a.run.app';
const response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + idToken
}
});
Logger.log(response.getContentText());
}