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