Verificando um token JSON da Web - 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á.

Verificando um token JSON da Web

JSONos tokens da web (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. Seu aplicativo confia em seu grupo de usuários como emissor de token, mas e se um usuário interceptar o token em trânsito? Você deve garantir que seu aplicativo esteja recebendo o mesmo token emitido pelo Amazon Cognito.

O Amazon Cognito emite tokens que usam alguns dos recursos de integridade e confidencialidade da especificação OpenID Connect (). OIDC Os tokens do grupo de usuários indicam validade com objetos como prazo de validade, emissor e assinatura digital. A assinatura, o terceiro e último segmento do . -delimitedJWT, é o principal componente da validação do token. Um usuário mal-intencionado pode modificar um token, mas se seu aplicativo recuperar a chave pública e comparar a assinatura, ela não corresponderá. Qualquer aplicativo processado JWTs a partir da OIDC autenticação 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 deJWTs. O desenvolvimento de aplicativos abrange uma variedade de linguagens e plataformas de programação. Como o Amazon Cognito implementa de OIDC forma suficientemente próxima da especificação pública, qualquer JWT biblioteca confiável em seu ambiente de desenvolvedor preferido pode lidar com seus requisitos de verificação.

Essas etapas descrevem a verificação de um JSON Web Token (JWT) do grupo de usuários.

Pré-requisitos

Sua biblioteca ou estrutura de software já pode lidar com as tarefas desta seção. SDK AWS SDKsforneç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 decodificar e verificar um JSON Web Token ()JWT. Se você quiser processar manualmente os tokens para API processamento no lado do servidor ou se estiver usando outras linguagens de programação, essas bibliotecas podem ajudar. Veja a lista de bibliotecas da OpenID Foundation para trabalhar com JWT tokens.

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.

Confirme 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 e o RSA algoritmo que o Amazon Cognito usou para assinar o token. kid alg O Amazon Cognito assina tokens com um alg de RS256. kidÉ uma referência truncada a uma chave de assinatura RSA privada de 2048 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 base64, 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 seu JWKSURI.

O cabeçalho e a carga são codificados em base64JSON. É possível identificá-los pelos caracteres de abertura eyJ que são decodificados para o caractere inicial {. Se seu usuário apresentar um token codificado em base64 JWT para 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.

Valide o JWT

A JWT assinatura é uma combinação em hash do cabeçalho e da carga útil. O Amazon Cognito gera dois pares de chaves RSA criptográficas 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 JWT token
  1. Decodifique o token de ID.

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

    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 do Amazon JWT Cognito usando. AWS Lambda

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

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

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

      Para obter mais informações JWK e JWK conjuntos, consulte JSONWeb 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)

      kidÉ uma dica que indica qual chave foi usada para proteger a Assinatura JSON Web (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 RSA assinatura com SHA -256. Para obter mais informações sobreRSA, consulte RSAcriptografia.

      Tipo de chave (kty)

      O kty parâmetro identifica a família de algoritmos criptográficos usada com a chave, como "RSA" neste exemplo.

      RSAexpoente () e

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

      RSAmódulo () n

      O n parâmetro contém o valor do módulo para a chave RSA pública. Ele é representado como um valor urlUInt codificado em Base64.

      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 na chave pública JSON da Web uma kid que kid corresponda à suaJWT.

  3. Use uma JWT biblioteca para comparar a assinatura do emissor com a assinatura no token. A assinatura do emissor é derivada da chave pública (o RSA módulo"n") do kid in jwks.json que corresponde ao token. kid Talvez seja necessário converter o JWK para o PEM formato primeiro. O exemplo a seguir usa o JWT e JWK e usa a biblioteca Node.js, jsonwebtoken, para verificar a assinatura: 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 as JWT reivindicações
  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 reclamação, envie uma solicitação para um API like GetUser. APIas solicitações que você autoriza com um token de acesso retornam um erro se o token tiver expirado.

    3. Apresente seu token de acesso em uma solicitação ao userInfo ponto final. 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ê está aceitando apenas o token de acesso em suas API operações na web, seu valor deve seraccess.

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