

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 tokens web JSON
<a name="amazon-cognito-user-pools-using-tokens-verifying-a-jwt"></a>

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.

**Topics**
+ [Pré-requisitos](#amazon-cognito-user-pools-using-tokens-prerequisites)
+ [Valide tokens com aws-jwt-verify](#amazon-cognito-user-pools-using-tokens-aws-jwt-verify)
+ [Noções básicas e inspeções de tokens](#amazon-cognito-user-pools-using-tokens-manually-inspect)

## Pré-requisitos
<a name="amazon-cognito-user-pools-using-tokens-prerequisites"></a>

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.
+ [Integração da autenticação e autorização do Amazon Cognito com aplicações móveis e da web](cognito-integrate-apps.md)
+ [Exemplos de código para o Amazon Cognito Identity Provider usando AWS SDKs](https://docs.aws.amazon.com/cognito/latest/developerguide/service_code_examples.html)
+ [Fluxos de trabalho avançados](https://docs.amplify.aws/lib/auth/advanced/q/platform/js/#retrieve-jwt-tokens) no *Amplify Dev Center*

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](http://openid.net/developers/jwt/) (Lista básica de bibliotecas da OpenID para trabalhar com tokens JWT).

## Valide tokens com aws-jwt-verify
<a name="amazon-cognito-user-pools-using-tokens-aws-jwt-verify"></a>

Em um aplicativo Node.js, AWS recomenda que a [aws-jwt-verifybiblioteca](https://github.com/awslabs/aws-jwt-verify) valide os parâmetros no token que o usuário passa para o 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.
+ Que os tokens de acesso ou ID não estão malformados nem expirados e têm uma assinatura válida.
+ Que os tokens de acesso vieram dos [grupos de usuários e clientes de aplicações corretos](https://github.com/awslabs/aws-jwt-verify#verifying-jwts-from-amazon-cognito).
+ Essas declarações de token de acesso contêm os [escopos OAuth 2.0 corretos](https://github.com/awslabs/aws-jwt-verify#checking-scope).
+ Que as chaves que assinaram os tokens de acesso e ID [correspondem a uma chave de assinatura `kid` do *URI JWKS* dos grupos de usuários](https://github.com/awslabs/aws-jwt-verify#the-jwks-cache).

  O URI do JWKS contém informações públicas sobre a chave privada que assinou o token do usuário. Você pode encontrar o URI do JWKS para seu grupo de usuários em `https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json`.

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 [https://github.com/awslabs/aws-jwt-verify](https://github.com/awslabs/aws-jwt-verify)em GitHub.

## Noções básicas e inspeções de tokens
<a name="amazon-cognito-user-pools-using-tokens-manually-inspect"></a>

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
<a name="amazon-cognito-user-pools-using-tokens-step-1"></a>

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

**Signature**  
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 útil são JSON codificados em base64url. É possível identificá-los pelos caracteres de abertura `eyJ` que são decodificados para o caractere inicial `{`. Se o usuário apresentar um JWT codificado em base64url para a aplicação e ele não estiver no formato `[JSON Header].[JSON Payload].[Signature]`, ele não é um token válido do Amazon Cognito e você poderá descartá-lo.

A aplicação de exemplo a seguir verifica os tokens do grupo de usuários com `aws-jwt-verify`.

```
// cognito-verify.js
// Usage example: node cognito-verify.js eyJra789ghiEXAMPLE

const { CognitoJwtVerifier } = require('aws-jwt-verify');

// Replace with your Amazon Cognito user pool ID
const userPoolId = 'us-west-2_EXAMPLE';

async function verifyJWT(token) {
  try {
    const verifier = CognitoJwtVerifier.create({
      userPoolId,
      tokenUse: 'access', // or 'id' for ID tokens
      clientId: '1example23456789', // Optional, only if you need to verify the token audience
    });

    const payload = await verifier.verify(token);
    console.log('Decoded JWT:', payload);
  } catch (err) {
    console.error('Error verifying JWT:', err);
  }
}

// Example usage
if (process.argv.length < 3) {
  console.error('Please provide a JWT token as an argument.');
  process.exit(1);
}

const MyToken = process.argv[2];
verifyJWT(MyToken);
```

### Validar o JWT
<a name="amazon-cognito-user-pools-using-tokens-step-2"></a>

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](http://openid.net/developers/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](https://github.com/awslabs/aws-support-tools/tree/master/Cognito/decode-verify-jwt). AWS Lambda

1. 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)](https://tools.ietf.org/html/rfc7517).
**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](https://tools.ietf.org/html/rfc3447).   
**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.

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

### Verificar as declarações
<a name="amazon-cognito-user-pools-using-tokens-step-3"></a>

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

   1. Se seu token de acesso incluir uma `aws.cognito.signin.user.admin` reivindicação, envie uma solicitação para uma API como [GetUser](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GetUser.html). As solicitações de API que você [autoriza com um token de acesso](https://docs.aws.amazon.com/cognito/latest/developerguide/user-pools-API-operations.html#user-pool-apis-auth-unauth) retornarão um erro se o token tiver expirado.

   1. Apresente seu token de acesso em uma solicitação ao [endpoint userinfo](userinfo-endpoint.md). A solicitação retornará um erro se o token tiver expirado.

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

1. 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>`.

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