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