"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Creación de un conjunto de notificaciones JWT válido

Creación de un conjunto de notificaciones JWT válido

Publicado el 2024-11-04
Navegar:347

Building a valid JWT Claims Set

Introducción

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.

¿Qué son los JWT?

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.

¿Por qué necesitas JWT?

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.

¿Qué son las reclamaciones de 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:

  • iss: El emisor del JWT, la cuenta de servicio que se estará autenticando, en este caso debe ser el correo electrónico de la cuenta de servicio.
  • sub: El asunto del usuario del JWT, que es el correo electrónico de la cuenta de servicio.
  • aud: la audiencia del JWT, que es la URL del recurso protegido por IAP.
  • iat: La hora emitida, que es la hora en la que se generó el JWT. Debe ser un número entero en UTC.
  • exp: El tiempo de vencimiento, que es el momento en el que el JWT dejará de ser válido. Existen limitaciones adicionales que documenta Cloud IAM: que no puede ser en el pasado y no más de 12 horas en el futuro.

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.

Entonces sobre eso PR

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í.

Declaración de liberación Este artículo se reproduce en: https://dev.to/sigje/building-a-valid-jwt-claims-set-4l58?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

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