"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Construindo um conjunto de declarações JWT válido

Construindo um conjunto de declarações JWT válido

Publicado em 2024-11-04
Navegar:339

Building a valid JWT Claims Set

Introdução

Eu precisava revisar uma solicitação pull que estava corrigindo um problema relatado com uma amostra e, enquanto os testes eram aprovados, parecia que deveria haver algo mais acontecendo com a amostra que precisava ser alterado.

Já conheço JSON Web Tokens (JWTs pronunciados como "jots") há algum tempo, não os conheço. Ver este PR me deu um motivo para me aprofundar mais neles.

O que são JWTs

JWTs são um método de padrão aberto para transmissão segura de informações entre as partes. Eles são frequentemente usados ​​para autenticar usuários e autorizar acesso a recursos. Eles consistem em 3 partes: cabeçalho, carga útil e assinatura.

Por que você precisa de JWTs

A API de credenciais de conta de serviço do IAM cria credenciais de curta duração para representar contas de serviço do IAM. O signJwtmethod assinará o JWT usando uma chave privada gerenciada pelo sistema de uma conta de serviço. Dentro do corpo da solicitação do método signJwt, o campo de carga útil deve conter um objeto JSON serializado que contém um conjunto de declarações JWT.

O que são reivindicações JWT

As declarações são as informações principais que o JWT transmite.

Aqui está um exemplo de um conjunto de declarações 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 declarações inclui os seguintes campos:

  • iss: O emissor do JWT, a conta de serviço que será autenticada, neste caso deverá ser o email da conta de serviço.
  • sub: o assunto do usuário do JWT, que é o e-mail da conta de serviço.
  • aud: o público do JWT, que é a URL do recurso protegido pelo IAP.
  • iat: O horário emitido, que é o horário em que o JWT foi gerado. Precisa ser um número inteiro em UTC.
  • exp: O tempo de expiração, que é o momento em que o JWT não será mais válido. Existem limitações adicionais que o Cloud IAM documenta: não pode estar no passado e não mais do que 12 horas no futuro.

Ao incluir essas declarações na carga útil do seu JWT, você pode garantir que ela seja válida e possa ser usada para acessar recursos protegidos pelo IAP.

Então, sobre esse PR

O código original parecia

    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,
        }
    )

Sei que algo está acontecendo com os testes, mas não quero impedir a resolução do problema subjacente com este código.

O autor do PR enviou a alteração

iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()

Parecia que seria uma solução incompleta. Com base na documentação da API, percebi que a correção enviada ainda não configuraria iat para digitar int e ainda falharia. Propus uma pequena mudança que resolveria o problema do PR de

now_utc = datetime.datetime.now(tz=datetime.timezone.utc)  
iat = int(now_utc.timestamp())

Quanto mais pensei sobre isso, percebi que Datetime não é útil para este exemplo. O módulo Datetime fornece classes para manipulação de datas e horas que são úteis quando você deseja datas. Literalmente precisamos de um número inteiro em UTC para que o módulo Time seja mais útil.

Insetad, podemos fazer isso

  now = int(time.time())

    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": now,
            "exp": now   3600,
        }
    )

Encontre o código completo (atualizado!) Para este exemplo aqui.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/sigje/building-a-valid-jwt-claims-set-4l58?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3