Necesitaba revisar una solicitud de extracción que estaba solucionando un problema informado con una muestra y, mientras pasaban las pruebas, sentí que debía haber algo más con la muestra que debía cambiar.
Conozco los tokens web JSON (JWT que se pronuncian "jots") desde hace un tiempo, no los los conozco. Ver este PR me dio una razón para profundizar más en ellos.
Los JWT son un método estándar abierto para transmitir información de forma segura entre partes. A menudo se utilizan para autenticar usuarios y autorizar el acceso a recursos. Constan de 3 partes, un encabezado, carga útil y firma.
La API de credenciales de cuentas de servicio de IAM crea credenciales de corta duración para hacerse pasar por cuentas de servicios de IAM. El método signJwt firmará el JWT utilizando la clave privada administrada por el sistema de una cuenta de servicio. Dentro del cuerpo de la solicitud del método signJwt, el campo de carga útil debe contener un objeto JSON serializado que contenga un conjunto de notificaciones JWT.
Las reclamaciones son la información principal que transmite el JWT.
A continuación se muestra un ejemplo de un conjunto de notificaciones válido:
{ "iss": "https://cloud.google.com/iam", "sub": "projects/-/serviceAccounts/[email protected]", "aud": "https://my-iap-protected-app.example.com", "iat": 1694003600, "exp": 1694007200 }
Este conjunto de reclamaciones incluye los siguientes campos:
Al incluir estos reclamos en la carga útil de su JWT, puede asegurarse de que sea válido y pueda usarse para acceder a recursos protegidos por IAP.
El código original parecía
iat = datetime.datetime.now(tz=datetime.timezone.utc) exp = iat 3600 return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": iat, "exp": exp, } )
Sé que algo sucede con las pruebas, pero no quiero impedir que se resuelva el problema subyacente con este código.
El autor de relaciones públicas envió el cambio
iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
Parecía que esto sería una solución incompleta. Según la documentación de la API, me di cuenta de que la solución enviada aún no configuraba iat para escribir int y aún fallaba. Propuse un ligero cambio que resolvería el problema del PR de
now_utc = datetime.datetime.now(tz=datetime.timezone.utc) iat = int(now_utc.timestamp())
Cuanto más lo pienso, me doy cuenta de que Datetime no es útil para este ejemplo. El módulo Datetime proporciona clases para manipular fechas y horas que son útiles cuando desea fechas. Literalmente necesitamos un número entero en UTC para que el módulo Hora sea más útil.
Insetad, podemos hacer esto
now = int(time.time()) return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": now, "exp": now 3600, } )
Encuentre el código completo (¡actualizado!) para este ejemplo aquí.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3