

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>

É possível decodificar, ler e modificar facilmente os tokens web JSON (JWTs). 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 aplicação que processe 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)
+ [Validar 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>

Sua biblioteca, o SDK ou o framework de software podem processar as tarefas nesta seção. AWSOs SDKs fornecem ferramentas para manipulação e gerenciamento de tokens do grupo de usuários do Amazon Cognito em seu aplicativo. AWS Amplifyinclui 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 SDKs AWS](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).

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

Em um Node.js aplicativo, AWS recomenda que a [aws-jwt-verifybiblioteca](https://github.com/awslabs/aws-jwt-verify) valide 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.
+ 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).
+ Que as reivindicações de token de acesso contêm os [escopos corretos do OAuth 2.0](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 Node.js aplicativo 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 à aplicação, considere como o Amazon Cognito monta os 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 os JWTs do Amazon Cognito enquanto você prepara a aplicação.

### 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 identificador RSA256 derivado de uma chave de assinatura e 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}}', // you must 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 JWTs do grupo 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 criptográfico RS256, 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. É representado como um Base64urlUInt-encoded valor.  
**Modulus (`n`) RSA**  
O parâmetro `n` contém o valor de modulus da chave pública RSA. É representado como um Base64urlUInt-encoded valor.  
**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 `aud` declaração em um token de ID e a `client_id` reivindicação em um token de acesso devem corresponder à ID do cliente do aplicativo que foi criada no grupo de usuários do Amazon Cognito.

1. A declaração issuer (`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.