Autenticação: Refresh Token com NestJS \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 07 Horas 

 43 Min 

 31 Seg 

   Tempo restante da oferta: 07 43 31 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Autenticação: Refresh Token com NestJS  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) 

# Autenticação: Refresh Token com NestJS

 Neste artigo vamos continuar no assunto de autenticação, abordando a estratégia de refresh token com o NestJS.

 [ Wesley Gado ](https://www.treinaweb.com.br/blog/autor/wesley-gado) 4 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/12/NEST-JS.png)  

Neste artigo vamos aprender sobre a estratégia de Refresh Tokens com [NestJS](https://www.treinaweb.com.br/blog/o-que-e-nestjs "NestJS"). Quando utilizamos tokens de acesso usando o padrão JWT para autenticação, estes tokens possuem um tempo de validade por motivos de segurança, desta forma mitigando o risco do uso de um token por usuários mal intencionados.

Porém temos alguns pontos que merecem atenção: quando este token é expirado, é necessário efetuar o login novamente para ter um novo token de acesso. Além da questão de usabilidade onde o usuário teria que efetuar login várias vezes em um determinado sistema, também tem outro ponto de seguraça, onde o usuário e senha ficariam expostos nas requisições.

Uma estratégia para que não seja necessário efetuar o login novamente e que evita o tráfego de dados sensíveis nas requisições é o uso de refresh tokens. Com eles o servidor substitui o token expirado por um novo token de acesso utilizando um refresh token para gerar um novo token.

[  ![Node.js - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/node-js.svg)   Curso Node.js - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/nodejs-fundamentos)

Vamos ver como podemos desenvolver esse recurso, para isto vamos utilizar a base de um exemplo já utilizado no artigo [Autenticação: Protegendo Rotas com NestJS e Passport](https://www.treinaweb.com.br/blog/autenticacao-protegendo-rotas-com-nestjs-e-passport "Autenticação: Protegendo Rotas com NestJS e Passport"), que pode ser baixado [neste repositório do github](https://github.com/wesleygado/artigo-jwt-nest/tree/artigo-jwt-autenticacao-autorizacao "neste repositório do github").

No momento, quando efetuado o login é gerado o token principal, conforme abaixo:

![Efetuando login e gerando token de acesso](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/01/Efetuando-login-e-gerando-token.png)

Uma observação imporante é que a estratégia de refresh token pode ser implementanda de diversas maneiras. No caso abordando por este artigo estamos utilizando os Tokens JWT. É uma caracteristica do Token JWT ter um tempo determinado de validade, portanto, ele expira, e não é diferente com o Refresh Token, porém, o Refresh Token deve ter seu tempo de validade maior que o token de acesso, que podemos configurar no momento da criação deste token.

Portanto, agora vamos gerar também o refresh token além do access token. Vale ressaltar que o refresh token deve ter um tempo de expiração maior que o token de acesso, contudo, neste caso do artigo que estamos abordando [Tokens JWT](https://www.treinaweb.com.br/blog/o-que-e-jwt "Tokens JWT") para o refresh token. Existem outras estratégias que podem ser utilizadas abordando refresh tokens.

### Gerando Refresh Token com NestJS

Primeiramente, no arquivo `auth.service.ts` atualize o método `gerarToken()` para gerar o refresh token, neste caso alteramos o tempo de expiração e a secret key para aumentar a segurança:

```tsx
async gerarToken(payload: User) {
    const accessToken = this.jwtService.sign(
      { email: payload.email },
      {
        secret: 'sua-chave',
        expiresIn: '30s',
      },
    );

    const refreshToken = this.jwtService.sign(
      { email: payload.email },
      {
        secret: 'sua-chave-refresh',
        expiresIn: '60s',
      },
    );
    return { access_token: accessToken, refresh_token: refreshToken };
  }

```

Ao efetuar o login teremos o seguinte retorno:

![gerando refresh token com NestJS](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/01/gerando-refresh-token.png)

Veja que agora temos dois tokens, o `access_token` que será utilizado para autenticar as requisições, e o `refresh_token` que será utilizado para gerar o novo par de tokens. Lembrando que neste caso o [front-end](https://www.treinaweb.com.br/blog/o-que-e-front-end-e-back-end "front-end") que fará o gerenciamento desses tokens.

## Desenvolvendo rota refresh e verificando validade do token

O próximo passo será desenvolver uma rota que retorne os novos tokens baseado no `refrest_token`. Portanto, criaremos essa nova rota no arquivo `auth.controller.ts`, da seguinte maneira:

```tsx
@Post('auth/refresh')
  reautenticar(@Body() body) {
    return this.authService.reautenticar(body); //este método será implementado abaixo, portanto é esperado que de erro.
  }

```

Agora é necessário implementar o método `reautenticar()` no `auth.service.ts`, no caso deve-se passar o token pelo corpo da requisição. Lembrando que é uma requisição **POST**, confirmar se o token é válido, se for retornar o novo par de tokens.

```tsx
async reautenticar(body) {
    const payload: User = await this.verificarRefrestToken(body); ////este método também será implementado abaixo
    return this.gerarToken(payload);
  }

```

Repare que criamos uma constante `payload` sendo um usuário, pois precisamos verificar se o token é referente a um usuário existente para ser autenticado e também verificar a secret key. Para isso é criado o método `verificarRefreshToken()`, que irá retornar este usuário caso ele seja válido:

```tsx
  private async verificarRefreshToken(body) {
    const refreshToken = body.refresh_token;

    if (!refreshToken) {
      throw new NotFoundException('Usuário não encontrado');
    }

    const email = this.jwtService.decode(refreshToken)['email'];
    const usuario = await this.usersService.findOneByEmail(email);

    if (!usuario) {
      throw new NotFoundException('Usuário não encontrado');
    }

    try {
      this.jwtService.verify(refreshToken, {
        secret: 'sua-chave-refresh',
      });
      return usuario;
    } catch (err) {
      if (err.name === 'JsonWebTokenError') {
        throw new UnauthorizedException('Assinatura Inválida');
      }
      if (err.name === 'TokenExpiredError') {
        throw new UnauthorizedException('Token Expirado');
      }
      throw new UnauthorizedException(err.name);
    }
  }
}

```

***Obs:** O método `verificarRefreshToken()` é um método privado, pois somente os métodos da própria classe que poderão chamá-lo.*

Veja que criamos a constante `refreshToken` pegando o refresh token do body, então usamos o método `decode()` para pegar o payload do token, mais precisamente a propriedade email, buscamos na base de dados se existe um usuário com este email. Se negativo, lançamos a exceção que não há usuários, caso positivo vamos verificar se a secret key está correta utilizando o `verify()`. Se tudo ocorrer da forma esperada retornamos o usuário, caso contrário tratamos os possíveis erros.

Com o usuário podemos então retornar e reaproveitar o método `gerarToken()` passando o usuário como payload.

[  ![Nest.js - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/nest-js.svg)   Curso Nest.js - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/nestjs-fundamentos)

### Testando rota refresh token

Agora vamos testar! É necessário criar uma nova requisição no insomnia com o nome refresh, lembrando que é uma requisição **POST**, com a seguinte URL: http://localhost:3000/auth/refresh.

- Vamos gerar os tokens fazendo o login normalmente:

![gerando token e refresh token](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/01/gerando-par-de-tokens.png)

- Vamos copiar o refresh token, ir na requisição refresh e passar no corpo da requisição:

![gerando par de tokens a partir do refresh token](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/01/gerando-tokens-a-partir-do-refresh-token.png)

Perfeito, os novos tokens estão sendo gerados a partir de um refresh token. Vale alguns pontos aqui, um deles é que o refresh token também expira, obviamente. Caso o refresh token esteja expirado, será retornado o status code 401: `Unauthorized`:

![Obtendo exceção de token expirado - Unauthorized](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/01/obtendo-excecao-de-token-expirado.png)

Desta forma sendo necessário o usuário efetuar o login novamente para ter acesso aos novos tokens. Outro ponto que vale destaque é que na abordagem deste artigo, como alteramos a secret key no momento da criação do refresh token ele será exclusivo para gerar novos tokens. Não será possível autenticar o usuário em uma rota utilizando um refresh token, sendo necessário sempre passar o token de acesso nas rotas.

### Conclusão

Neste artigo verificamos como aplicar a estratégia de refresh token com NestJS, essa estratégia é amplamente utilizada. Pois ela permite trabalharmos com autenticação de forma segura e também facilita a experiência do usuário, onde não é necessário efetuar o login repetidas vezes quando um token de acesso é expirado e evita a exposição de dados sensíveis do usuário nas requisições.

Caso tenha ficado alguma dúvida você pode acessar o repositório deste exemplo para futuras consultas [neste repositório do GitHub](https://github.com/wesleygado/artigo-jwt-nest/tree/artigo-jwt-autenticacao-autorizacao "clicanco aqui").

Recomendo também a leitura do artigo [Autenticação: Geração de Token JWT com NestJS e Passport](https://www.treinaweb.com.br/blog/autenticacao-geracao-de-token-jwt-com-nestjs-e-passport "Autenticação: Geração de Token JWT com NestJS e Passport") onde é explicado sobre a geração de Tokens JWT para autenticação uttilizando o NestJS e a biblioteca [Passport](https://www.passportjs.org/ "Passport").

Por fim, caso queira aprender mais sobre [NestJS](https://nestjs.com/) saiba que aqui na [TreinaWeb](https://treinaweb.com.br/) temos o curso [Nest.js - Fundamentos](https://www.treinaweb.com.br/curso/nestjs-fundamentos) que possui **02h07 de vídeos** e um total de **18 exercícios**. Conheça também nossos outros cursos de [TypeScript](https://www.treinaweb.com.br/busca?q=TypeScript).

Veja quais são os tópicos abordados durante o curso de Nest.js - Fundamentos:

- Conhecendo a estrutura;
- Utilizando Nest CLI
- Entendendo Rotas, Controllers e Views;;
- Conexão com banco de dados;
- Usando TypeORM;
- Template Engine.

- [ #Back-end ](https://www.treinaweb.com.br/blog/tag/back-end)
- [ #Node.js ](https://www.treinaweb.com.br/blog/tag/node-js)
- [ #NestJS ](https://www.treinaweb.com.br/blog/tag/nestjs)

Autor

 ![Wesley Gado](//secure.gravatar.com/avatar/1b770ca482a7232b1885881430a592bb?d=mm)

## Wesley Gado

 Formado em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de São Paulo, atuou em projetos como desenvolvedor Front-End. Nas horas vagas grava Podcast e arrisca uns três acordes no violão. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wesley-gado)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     3 anos atrás

    ##  [ Guia do framework NestJS ](https://www.treinaweb.com.br/blog/guia-do-framework-nestjs) 

     Neste guia do framework NestJS vamos fazer um compilado de tópicos úteis sobre o framework, desde criar um projeto básico até autenticação.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/08/NEST-JS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Autenticação: Geração de Token JWT com NestJS e Passport ](https://www.treinaweb.com.br/blog/autenticacao-geracao-de-token-jwt-com-nestjs-e-passport) 

     Neste artigo vamos criar uma aplicação para a geração de Tokens JWT utilizando NestJS e a biblioteca Passport.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/12/NEST-JS-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Autenticação: Protegendo Rotas com NestJS e Passport ](https://www.treinaweb.com.br/blog/autenticacao-protegendo-rotas-com-nestjs-e-passport) 

     Neste artigo vamos aprender a proteger rotas com o NestJS e a biblioteca passport, utilizando a estratégia de autenticação com Tokens JWT.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/07/fluxo-de-autenticacao-baseado-em-jwt-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     5 anos atrás

    ##  [ Fluxo de autenticação baseado em JWT ](https://www.treinaweb.com.br/blog/fluxo-de-autenticacao-baseado-em-jwt) 

     Neste artigo iremos aprender de teórica como é o fluxo de autenticação baseado em JWT dentro de uma API REST.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/06/25203902/AUTENTICAÇÃOxAUTORIZAÇÃO-400x280.png)  [ Tecnologia ](https://www.treinaweb.com.br/blog/categoria/tecnologia) 

     8 anos atrás

    ##  [ Autenticação x Autorização ](https://www.treinaweb.com.br/blog/autenticacao-x-autorizacao) 

     Neste artigo veremos o que é e qual a finalidade da Autenticação e Autorização em aplicações.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/05/autenticação-jwt-em-api-jax-rs-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     7 anos atrás

    ##  [ Implementando autenticação baseada em JWT em uma API RESTful JAX-RS ](https://www.treinaweb.com.br/blog/implementando-autenticacao-baseada-em-jwt-em-uma-api-restful-jax-rs) 

     Segurança é um item essencial e uma forma de limitar o acesso da aplicação é através de autenticação, que uma API JAX-RS pode implementar através do JWT.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/06/25105828/DJANGO-AUTENTICAÇÃO-2-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     8 anos atrás

    ##  [ Implementando autenticação no Django – Parte 2 ](https://www.treinaweb.com.br/blog/implementando-autenticacao-no-django-parte-2) 

     Veja neste artigo como implementar os recursos de logout, alteração de senha e proteção de páginas em projetos Django.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/06/21114028/DJANGO-AUTENTICAÇÃO-1-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     8 anos atrás

    ##  [ Implementando autenticação no Django - Parte 1 ](https://www.treinaweb.com.br/blog/implementando-autenticacao-no-django-parte-1) 

     A autenticação é uma das principais funcionalidades em um sistema. É com ela que protegemos as funcionalidades de uma aplicação e permitimos que estas só sejam acessadas por usuários cadastrados e autenticados previamente. Nesta série de artigos, veremos como implementar os principais recursos do módulo de autenticação do Django.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/07/checklist-de-seguranca-para-autenticacao-400x280.png)  [ Segurança da Informação ](https://www.treinaweb.com.br/blog/categoria/seguranca-da-informacao) 

     10 anos atrás

    ##  [ Checklist de segurança para autenticação ](https://www.treinaweb.com.br/blog/checklist-de-seguranca-para-autenticacao) 

     Cuidar da segurança é um dos pilares para a sustentação de qualquer aplicação na web. Sem o mínimo não é possível nem mesmo garantir uma razoável disponibilidade.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/07/o-que-e-jwt-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     5 anos atrás

    ##  [ O que é JWT? ](https://www.treinaweb.com.br/blog/o-que-e-jwt) 

     Neste artigo iremos falar sobre o que é, qual a estrutura e onde são utilizados os JSON Web Tokens ou como comumente são conhecidos JWT.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/spring-framework-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     6 anos atrás

    ##  [ O que é Spring Framework? ](https://www.treinaweb.com.br/blog/o-que-e-spring-framework) 

     Confira neste artigo o Spring framework: um ecossistema de desenvolvimento para facilitar a criação de aplicações Java.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/04/o-que-e-o-spring-security-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     6 anos atrás

    ##  [ O que é o Spring Security? ](https://www.treinaweb.com.br/blog/o-que-e-o-spring-security) 

     Neste artigo veremos o que é o Spring Security, quais suas funcionalidades e como ele pode aumentar a segurança de nossas aplicações Java.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **07h 43min 31s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
