Lo que estoy tratando de hacer es:
Mi código funciona bien en el desarrollo local, mediante el uso del archivo json de clave de credencial generado para la cuenta de servicio mencionada en el paso 1, a través del mecanismo predeterminado de credenciales de la aplicación (configuré la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la ruta de credentials.json)
import {google} from 'googleapis' const scopes = [ 'https://www.googleapis.com/auth/gmail.readonly', 'https://www.googleapis.com/auth/gmail.modify', ]; const auth = new google.auth.GoogleAuth({ clientOptions: { subject: 'user@email.com', }, scopes, }); const gmail = google.gmail({ version: 'v1', auth, }); const list = await gmail.users.messages.list({ userId: 'me', maxResults: 10, }); El problema es AFAIK, en el entorno local (también conocido como no GCE) GoogleAuth usa JWT y en GCE usa el método Compute Auth, donde un subject no se puede configurar o si se configura se ignora.
Por eso, al implementar Cloud Function, arroja un error sobre Precondition Check Failed y nada más específico.
En mi conocimiento e investigación limitados, creo que la solución sería convertir de alguna manera Compute Auth -> JWT con un tema definido.
La solución actual que he implementado y funciona consiste en guardar el credentials.json en Google Secret Manager:
// Acquire credentials from secret manager: const secret = await getApiKeyFromSecretManager('SECRET_NAME'); const jsonCreds = JSON.parse(Buffer.from(secret).toString()); // Create the JWT const auth = google.auth.fromJSON(jsonCreds); auth.subject = 'user@email.com'; auth.scopes = scopes;Pero no me siento muy cómodo teniendo que acceder o guardar las credenciales en Secret Manager, ya que creo que la solución no es tan elegante como podría ser.