Connettersi ai servizi Google Cloud

Puoi utilizzare il ScriptApp.getIdentityToken() metodo per ottenere un token di identità 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.

Abilitare 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 UrlFetch servizio. L'ambito https://www.googleapis.com/auth/userinfo.email è incluso in questo esempio per aggiungere l'indirizzo email dell'utente al token di identità.

Nel file manifest del progetto script (appsscript.json), 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"
  ]
}

Configurare il servizio Google Cloud

Devi configurare il servizio Google Cloud in modo che accetti il token di identità rilasciato allo script. In genere, questa operazione prevede l'aggiunta dell'ID client dello script come pubblico consentito.

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

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