Como verificar um token Web JSON - Amazon Cognito

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Como verificar um token Web JSON

Os tokens web JSON (JWTs) podem ser decodificados, lidos e modificados facilmente. Um token de acesso modificado cria um risco de escalonamento de privilégios. Um token de ID modificado cria um risco de falsificação de identidade. Sua aplicação confia no grupo de usuários como emissor de token, mas e se um usuário interceptar o token em trânsito? Você deve garantir que a aplicação receba o mesmo token emitido pelo Amazon Cognito.

O Amazon Cognito emite tokens que usam alguns dos recursos de integridade e confidencialidade da especificação do OpenID Connect (OIDC). Os tokens do grupo de usuários indicam a validade com objetos como prazo de validade, emissor e assinatura digital. A assinatura, o terceiro e o último segmento do JWT delimitado por ., é o principal componente da validação do token. Um usuário mal-intencionado pode modificar um token, mas se sua aplicação recuperar a chave pública e comparar a assinatura, não haverá correspondência. Qualquer aplicativo processado JWTs a partir da autenticação OIDC deve realizar essa operação de verificação a cada login.

Nesta página, fazemos algumas recomendações gerais e específicas para verificação de JWTs. O desenvolvimento de aplicações abrange uma variedade de linguagens de programação e plataformas. Como o Amazon Cognito implementa o OIDC suficientemente próximo da especificação pública, qualquer biblioteca JWT confiável em seu ambiente de desenvolvedor preferencial pode lidar com seus requisitos de verificação.

Essas etapas descrevem como verificar um JSON web token (JWT) do grupo de usuários.

Pré-requisitos

Talvez sua biblioteca, SDK ou estrutura de software já realize as tarefas desta seção. AWS SDKs forneça ferramentas para manipulação e gerenciamento de tokens do grupo de usuários do Amazon Cognito em seu aplicativo. AWS Amplify inclui funções para recuperar e atualizar tokens do Amazon Cognito.

Para obter mais informações, consulte as páginas a seguir.

Muitas bibliotecas estão disponíveis para decodificação e verificação de um JSON Web Token (JWT). Se você precisar processar tokens manualmente para o processamento da API no lado do servidor ou se estiver usando outras linguagens de programação, essas bibliotecas poderão ajudar. Consulte a OpenID foundation list of libraries for working with JWT tokens (Lista básica de bibliotecas da OpenID para trabalhar com tokens JWT).

Valide tokens com aws-jwt-verify

Em um aplicativo Node.js, AWS recomenda o aws-jwt-verify biblioteca para validar os parâmetros no token que seu usuário passa para seu aplicativo. Com aws-jwt-verify, é possível preencher um CognitoJwtVerifier com os valores de reivindicação que você deseja verificar para um ou mais grupos de usuários. Alguns dos valores que ele pode verificar incluem o seguinte.

Para obter mais informações e exemplos de códigos que você pode usar em um aplicativo Node.js ou em um AWS Lambda autorizador, consulte aws-jwt-verifyligado GitHub.

Noções básicas e inspeções de tokens

Antes de integrar a inspeção de tokens ao seu aplicativo, considere como o Amazon Cognito é montado. JWTs Recupere exemplos de token do grupo de usuários. Decodifique-os e examine-os detalhadamente para entender suas características e determinar o que você deseja verificar e quando. Por exemplo, talvez você queira examinar a associação de grupo em um cenário e os escopos em outro.

As seções a seguir descrevem um processo para inspecionar manualmente o Amazon JWTs Cognito enquanto você prepara seu aplicativo.

Confirmar a estrutura do JWT

Um JSON Web Token (JWT) inclui três seções com um delimitador . (ponto) entre elas.

Cabeçalho

O ID da chave, o kid e o algoritmo RSA, o alg, que o Amazon Cognito usou para assinar o token. O Amazon Cognito assina tokens com um alg de RS256. kid é uma referência truncada a uma chave de assinatura privada RSA de 2.048 bits mantida pelo seu grupo de usuários.

Carga útil

Reivindicações de tokens. Em um token de ID, as reivindicações incluem atributos do usuário e informações sobre o grupo de usuários, o iss e o cliente da aplicação, o aud. Em um token de acesso, a carga útil inclui escopos, associação ao grupo, o grupo de usuários como iss e o cliente de aplicação como client_id.

Assinatura

A assinatura não é decodificável em base64url, como o cabeçalho e a carga útil. É um RSA256 identificador derivado de uma chave de assinatura e de parâmetros que você pode observar no URI do JWKS.

O cabeçalho e a carga são JSON codificados em base64url. É possível identificá-los pelos caracteres de abertura eyJ que são decodificados para o caractere inicial {. Se seu usuário apresentar um JWT codificado em base64url ao seu aplicativo e ele não estiver no formato[JSON Header].[JSON Payload].[Signature], não é um token válido do Amazon Cognito e você pode descartá-lo.

Validar o JWT

A assinatura JWT é uma combinação com hash do cabeçalho e da carga útil. O Amazon Cognito gera dois pares de chaves criptográficas RSA para cada grupo de usuários. Uma chave privada assina tokens de acesso e a outra assina tokens de ID.

Para verificar a assinatura de um token JWT
  1. Decodifique o token de ID.

    A OpenID Foundation também mantém uma lista de bibliotecas para trabalhar com tokens JWT.

    Você também pode usar AWS Lambda para decodificar o grupo JWTs de usuários. Para obter mais informações, consulte Decodificar e verificar os tokens JWT do Amazon Cognito usando. AWS Lambda

  2. Compare o ID de chave local (kid) com o kid público.

    1. Faça download e armazene o JSON Web Key (JWK) público correspondente para seu grupo de usuários. Ele está disponível como parte de um JSON Web Key Set (JWKS). Você pode localizá-lo construindo o seguinte URI jwks_uri para seu ambiente:

      https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json

      Para mais informações sobre JWK e conjuntos JWK , consulte JSON Web Key (JWK).

      nota

      O Amazon Cognito pode alternar a chave de assinatura no grupo de usuários. Como prática recomendada, armazene as chaves públicas na aplicação usando o kid como chave de cache, e atualize o cache periodicamente. Compare o kid nos tokens que a aplicação recebe com o cache.

      Se você receber um token com o emissor correto, mas um kid diferente, o Amazon Cognito pode ter alternado a chave de assinatura. Atualize o cache do endpoint jwks_uri do grupo de usuários.

      Este é um exemplo de arquivo jwks.json:

      { "keys": [{ "kid": "1234example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "1234567890", "use": "sig" }, { "kid": "5678example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "987654321", "use": "sig" }] }
      ID da chave (kid)

      O kid é uma dica que indica qual foi a chave usada para proteger a assinatura web JSON (JWS) do token.

      Algoritmo (alg)

      O parâmetro de cabeçalho alg representa o algoritmo criptográfico usado para proteger o token de ID. Os grupos de usuários usam um algoritmo RS256 criptográfico, que é uma assinatura RSA com SHA-256. Para mais informações sobre RSA, consulte Criptografia RSA.

      Tipo de chave (kty)

      O parâmetro kty identifica o algoritmo criptográfico usado pela família com a chave, como “RSA”, neste exemplo.

      Expoente RSA (e)

      O parâmetro e contém o valor de expoente da chave pública RSA. Ele é representado como um valor codificado em Base64URLUInt.

      Modulus (n) RSA

      O parâmetro n contém o valor de modulus da chave pública RSA. Ele é representado como um valor codificado em Base64URLUInt.

      Usar o use

      O parâmetro use descreve o uso pretendido da chave pública. Neste exemplo, o use valor sig representa assinatura.

    2. Pesquise a chave web JSON pública de um kid que corresponda ao kid do JWT.

  3. Use uma biblioteca de JWT para comparar a assinatura do emissor com a assinatura no token. A assinatura do emissor é derivada da chave pública (o módulo RSA "n") do kid em jwks.json que corresponde ao token kid. Talvez seja necessário converter a JWK em formato PEM primeiro. Esse exemplo a seguir adota o JWT e a JWK, e usa a biblioteca Node.js, jsonwebtoken, para verificar a assinatura do JWT:

    Node.js
    var jwt = require('jsonwebtoken'); var jwkToPem = require('jwk-to-pem'); var pem = jwkToPem(jwk); jwt.verify(token, pem, { algorithms: ['RS256'] }, function(err, decodedToken) { });

Verificar as declarações

Para verificar alegações JWT
  1. Usando um dos métodos a seguir, verifique se o token não expirou.

    1. Decodifique o token e compare a reivindicação exp com a hora atual.

    2. Se seu token de acesso incluir uma aws.cognito.signin.user.admin reivindicação, envie uma solicitação para uma API como GetUser. As solicitações de API que você autoriza com um token de acesso retornarão um erro se o token tiver expirado.

    3. Apresente seu token de acesso em uma solicitação ao endpoint userinfo. A solicitação retornará um erro se o token tiver expirado.

  2. A declaração aud em um token de ID e a declaração client_id em um token de acesso devem corresponder ao ID do cliente de aplicação criado no grupo de usuários do Amazon Cognito.

  3. A solicitação de emissor (iss) deve corresponder ao seu grupo de usuários. Por exemplo, um grupo de usuários criado na região us-east-1 terá o seguinte valor de iss:

    https://cognito-idp.us-east-1.amazonaws.com/<userpoolID>.

  4. Verifique a alegação token_use.

    • Se você estiver aceitando apenas o token de acesso nas APIs da Web, o valor do token terá de ser access.

    • Se estiver usando apenas o token de ID, o valor dele precisa ser id.

    • Se estiver usando os tokens de ID e acesso, a alegação token_use deverá ser id ou access.

Você já pode aceitar as alegações dentro do token.