Escribí una llamada a la API de Calendario simple usando el cliente oficial de NodeJS: https://github.com/googleapis/google-api-nodejs-client#service-account-credentials
Funciona bien en mi máquina local, usando una Cuenta de servicio configurada con Delegación en todo el dominio para crear el evento e invitar a una lista de asistentes en mi nombre.
Configuré la ubicación de las credenciales usando GOOGLE_APPLICATION_CREDENTIALS env var en mi máquina local, pero no configuré esto en el servicio Google Cloud Run porque supuestamente es automático ya que asocié la cuenta de servicio. Esta suposición parece cierta porque puedo llamar a las funciones de GoogleAuth y recuperar el nombre de cuenta de servicio esperado.
Sin embargo, una vez que intento ejecutarlo en Cloud Run, arroja el error:
Error: las cuentas de servicio no pueden invitar asistentes sin la delegación de autoridad en todo el dominio.
Al principio pensé que se trataba de un problema con las credenciales predeterminadas que de alguna manera cargaban la cuenta de servicio incorrecta.
Agregué el registro directamente antes de que se llame al evento para ver qué cuenta está usando:
const auth = new googleClient.auth.GoogleAuth({ clientOptions: { subject: eventOwner }, scopes: calendarScopes, }) const serviceAcctName = (await auth.getCredentials())?.client_email googleClient.options({ auth: auth }) logger.info(`${serviceAcctName} acting as ${eventOwner}, using calendar ${calendarId}`) const calendar = googleClient.calendar('v3') const response = await calendar.events.insert(event)El resultado del registro es exactamente como se esperaba, con la cuenta de servicio correcta actuando como el usuario correcto en la identificación de calendario correcta.
Verifiqué dos veces que la cuenta tiene delegación de autoridad en todo el dominio y los alcances adecuados, y funciona bien en mi máquina local, por lo que lo único que se me ocurre es algo sobre la función de la biblioteca de obtener credenciales predeterminadas en un El entorno de Google está sobrescribiendo mi llamada googleClient.options(). Pero todavía estoy confundido porque las funciones de GoogleAuth aún brindan la información de la cuenta de servicio esperada cuando toma el 'predeterminado'.