Connettersi ai servizi Google Cloud

Puoi utilizzare il metodo ScriptApp.getIdentityToken() per ottenere un token ID OpenID Connect (un token web JSON o JWT) per l'utente effettivo. Puoi utilizzare questo token per l'autenticazione con i servizi Google Cloud, come Cloud Run, configurati per accettarlo.

Abilita l'ambito openid

L'ambito openid è necessario per generare un token ID OpenID Connect. Devi anche elencare tutti gli altri ambiti utilizzati dallo script, ad esempio https://www.googleapis.com/auth/script.external_request per il servizio UrlFetch. L'ambito https://www.googleapis.com/auth/userinfo.email è incluso in questo esempio per aggiungere l'indirizzo email dell'utente al token ID.

Nel file manifest (appsscript.json) del progetto script, aggiungi l'ambito openid e tutti gli altri ambiti richiesti all'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 il servizio Google Cloud

Devi configurare il servizio Google Cloud in modo che accetti il token di identità emesso per lo script. In genere, questa operazione comporta l'aggiunta dell'ID client dello script come segmento di pubblico consentito.

Per trovare l'ID client dello script, puoi decodificare un token ID:

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

Per Cloud Run, puoi configurare segmenti di pubblico personalizzati per consentire questo ID client.

Effettuare una richiesta autenticata

Una volta configurato, puoi includere il token di identità nell'intestazione Authorization delle tue richieste:

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