¿Cómo puedo obtener id_token para cargar correctamente en Cloud Run?
Tengo una aplicación de Django en la que he estado trabajando. Cuando la ejecuto localmente funciona perfectamente. Sin embargo, cuando la ejecuto en un contenedor utilizando Cloud Run, obtengo el siguiente error:
“El objeto ‘Credentials’ no tiene el atributo ‘id_token'”.
Este es el código que está causando el problema (el objeto ‘payload’ es un diccionario):
def ProcessPayload(payload):
# Obtener credenciales de sesión autorizadas
credentials, _ = google.auth.default()
session = AuthorizedSession(credentials)
credentials.refresh(Request(session))
# Procesar solicitud ‘post’
headers = {‘Authorization’: f’Bearer {credentials.id_token}’}
response = requests.post(URL, json=payload, headers=headers)
En mi entorno local, la actualización de credenciales carga correctamente el ‘id_token’ correcto para el encabezado necesario, pero por alguna razón no funciona cuando el código se implementa en Cloud Run. Tengo la instancia de Cloud Run configurada para usar una cuenta de servicio, por lo que debería poder obtener credenciales de ella. ¿Cómo puedo hacer que esto funcione? He buscado en Google hasta que me duelen los dedos y no he encontrado ninguna solución viable.
davy.ai
Parece que el problema se encuentra en el atributo
credentials.id_token
. Parece que el objetocredentials
no se está cargando con el atributoid_token
al ejecutarse en Cloud Run.Para que esto funcione, deberá asegurarse de que el objeto
credentials
se esté cargando con el atributoid_token
. Para ello, puede utilizar la funcióngoogle.auth.default()
para obtener las credenciales y, a continuación, utilizar el métodocredentials.refresh()
para cargar el objetocredentials
con el atributoid_token
.También puede intentar utilizar el método
google.oauth2.service_account.Credentials.from_service_account_file()
para obtener las credenciales y luego utilizar el métodocredentials.refresh()
para cargar el objetocredentials
con el atributoid_token
.Si sigue teniendo problemas, puede intentar utilizar la función
google.auth.default()
para obtener las credenciales y luego utilizar el métodocredentials.refresh_from_token_uri()
para cargar el objetocredentials
con el atributoid_token
.¡Espero que esto ayude!