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

  Termina em   Tempo restante da oferta: 07 Horas 

 02 Min 

 54 Seg 

   Tempo restante da oferta: 07 02 54 

  [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: Protegendo Rotas com NestJS e Passport  [ 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: 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.

 [ 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)  

No 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) aprendemos a gerar Tokens JWT utilizando o NestJS e a biblioteca Passport. Agora vamos dar continuidade em relação à autenticação com NestJS e Passport.

Vale ressaltar que este artigo será uma continuação do artigo citado acima, portanto, é importante que você tenha o ambiente e a aplicação exemplo funcionando. Você pode baixar a aplicação no [repositório do GitHub](https://github.com/wesleygado/artigo-jwt-nest/tree/main "baixada neste repositório").

[  ![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)

## Criando rota lista de usuários

Exemplificando, vamos criar uma rota onde há uma lista de usuários, esta rota irá retornar esta lista, porém, somente usuários autenticados terão acesso a essa rota. Para isto vamos criar o método `findAll()` dentro do `users.service.ts`, este método irá retornar um JSON com alguns usuários, conforme abaixo:

```tsx
//users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { User } from './entities/user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository,
  ) {}
  create(createUserDto: CreateUserDto) {
    return this.userRepository.save(createUserDto);
  }

  findAll() {
    return {
      usuarios: [
        {
          nome: 'Paulo',
          endereco: 'av paulista',
          telefone: '1155555555',
        },
        {
          nome: 'Maria',
          endereco: 'av faria lima',
          telefone: '1155555580',
        },
        {
          nome: 'Samantha',
          endereco: 'av paulista',
          telefone: '1155555590',
        },
      ],
    };
  }

	async findOneByEmail(username: string) {
    return await this.userRepository.findOneBy({ email: username });
  }
}

```

Agora vamos criar a rota no `users.controller.ts`:

```tsx
//users.controller.ts
import { Controller, Get, Post, Body, UseGuards } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';
import { AuthGuard } from '@nestjs/passport';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post()
  async create(@Body() createUserDto: CreateUserDto) {
    return await this.usersService.create(createUserDto);
  }

  @Get()
  @UseGuards(AuthGuard('jwt')) // Decorator responsável pelo Guard
  listarUsuarios() {
    return this.usersService.findAll();
  }
}

```

Criamos uma rota **GET** e retornamos a lista de usuários, porém há uma particularidade, o uso do decorator `@UseGuards()`, é necessário usar este decorator para passar os Guards que serão responsáveis por verificar as regras de autenticação e autorização desta rota.

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

## Guards

O recurso “Guards” como o nome diz, são “Guardiões”, é o recurso que irá verificar se o usuário está autenticado para a rota em específico.

É importante saber que podemos criar guards específicos para cada necessidade. Neste caso o passport disponibiliza o `AuthGuard`, onde podemos apontar a estratégia que estamos utilizando, no caso JWT conforme exemplo acima.

Com a rota e os guards devidamente configurados precisamos atualizar o arquivo `local.auth.ts`. Neste momento é necessário fazer uma refatoração já que estamos utilizando a estratégia JWT para a autenticação. Devemos trocar o nome do arquivo para `jwt-strategy.ts` e o nome da classe para `JwtStrategy`. Em seguida, faremos algumas alterações conforme abaixo:

```tsx
//jwt-strategy.ts
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { JwtPayload } from './jwt-payload';
import { UsersService } from 'src/users/users.service';
import { User } from 'src/users/entities/user.entity';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
  constructor(private usersService: UsersService) {
    super({
      secretOrKey: 'sua-chave',
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
    });
  }
  async validate(payload: JwtPayload): Promise {
    const { email } = payload;
    const user = await this.usersService.findOneByEmail(email);
    if (!user) {
      throw new UnauthorizedException();
    }
    return user;
  }
}

```

Obs.: Confira onde estava a importação do LocalStrategy para atualizar para JwtStrategy.

### JWT Strategy

Nós fizemos algumas alterações importantes, passamos como parâmetro a estratégia JWT no `PassportStrategy`. Vale salientar que devemos prestar atenção no *import* correto, o `Strategy` deve ser importado da biblioteca `passport-jwt`, caso seja importado de uma biblioteca referente a outra estratégia teremos um erro na autenticação.

No `super()`, temos três propriedades, `secretOrKey` que deve ser a mesma chave que utilizamos ao gerar o Token JWT, `jwtFromRequest` aqui é onde iremos passar o Token na requisição, utilizando padrão Bearer Token no Header, e por último para que o Token expire no tempo determinado na criação do mesmo.

Devemos passar o payload no método `validate()`, que é o que passamos no corpo da requisição onde geramos o token relacionado a autenticação, esse payload é composto pelo email do usuário, em outros casos pode também possuir outros parâmetros. O passport também gera automaticamente as propriedades `iat` e `exp` que são, respectivamente, sobre a criação do token e expiração. Você pode consultar o site [jwt.io](http://jwt.io) e ver exemplos até criar tokens para ficar mais claro como eles são gerados.

Perceba que o payload é do tipo `JwtPayload`, mas não temos nenhuma referência ainda a ele, portanto vamos criar uma interface, que terá como propriedade o email. Assim, vamos mudar um pouco a estrutura da aplicação, onde vamos criar o diretório `strategies`, dentro do diretório `auth` , nele vamos adicionar o arquivo `jwt-strategy.ts` e criar o arquivo `jwt-payload.ts`.

```tsx
//jwt-payload.ts
export interface JwtPayload {
  email: string;
}

```

A estrutura da pasta `auth` ficará da seguinte forma:

![Estrutura de arquivos da past auth](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/11/estrutura.png)

Agora vamos conferir se os arquivos `auth.module.ts` e `users.module.ts` estão devidamente configurados conforme abaixo:

```tsx
//auth.module.ts
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from 'src/users/entities/user.entity';
import { UsersService } from 'src/users/users.service';
import { AuthController } from './auth.controller';
import { AuthService } from './auth.service';
import { JwtStrategy } from './strategies/jwt-strategy';

@Module({
  imports: [TypeOrmModule.forFeature([User]), JwtModule.register({})],
  controllers: [AuthController],
  providers: [AuthService, UsersService, JwtStrategy],
})
export class AuthModule {}

```

```tsx
//users.module.ts
import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { JwtModule } from '@nestjs/jwt';
import { AuthService } from 'src/auth/auth.service';
import { JwtStrategy } from 'src/auth/strategies/jwt-strategy';

@Module({
  imports: [TypeOrmModule.forFeature([User]), JwtModule.register({})],
  controllers: [UsersController],
  providers: [UsersService, AuthService, JwtStrategy],
})
export class UsersModule {}

```

## Testando proteção de rotas com Token JWT

Podemos testar a autenticação utilizando o insomnia, primeiramente vamos gerar o token na rota [`http://localhost:3000/auth/login`](http://localhost:3000/auth/login), lembrando que é uma rota POST.

![Requisição para o endpoint de autenticação com NestJS e Passsport retornando token com sucesso](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/11/autenticacao.png)

Agora vamos acessar a rota de listagem de usuários ([`http://localhost:3000/users`](http://localhost:3000/users)), para isso precisamos copiar o token e passar na requisição, lembrando que é uma rota GET:

![Requisição para o endpoist de lisagem de usuários da aplicação NestJS e Passsport utilizando token para autenticação com sucesso](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/11/autenticacao-com-token.png)

Selecionaremos Bearer na segunda aba, adicionaremos o Token no campo respectivo e clicar em Send. Veja que obtemos a lista de usuários como retorno, porém caso o token esteja expirado, incorreto ou inexistente, retornará o seguinte erro:

![Simulando erro de autenticação com token inválido retornando erro 401 Unauthorized](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/11/erro-de-autenticacao.png)

O usuário terá acesso às rotas que necessitam de autenticação somente enquanto o Token for válido. Outro ponto que devemos nos atentar é o conceito de autorização, pois o usuário pode ter gerado um token, mas uma rota determinada pode ser acessada por um tipo de usuário específico, por exemplo, veremos sobre este assunto no próximo artigo.

[  ![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)

## Conclusão

Nos aprendemos no artigo anterior a gerar o Token JWT com o NestJS e a biblioteca Passport, já neste criamos uma rota protegida, necessário então a autenticação por um Token JWT válido. Esses são alguns conceitos e recursos que podemos utilizar para criar aplicações mais robustas e seguras, outros pontos que vamos ver nos próximos artigos serão sobre autorização e “refresh tokens”. Desta forma abrangendo outros aspectos de uma aplicação que utiliza estes recursos.

O código do exemplo pode ser consultado [neste diretório do github](https://github.com/wesleygado/artigo-jwt-nest/tree/artigo-jwt-autenticacao-autorizacao "neste diretório do github") :)

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.

- [ #NodeJS ](https://www.treinaweb.com.br/blog/tag/nodejs)
- [ #express ](https://www.treinaweb.com.br/blog/tag/express)
- [ #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/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: Refresh Token com NestJS ](https://www.treinaweb.com.br/blog/autenticacao-refresh-token-com-nestjs) 

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

     Ler artigo
- ![](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/2018/06/28145950/security-csrf-400x280.jpg)  [ Segurança da Informação ](https://www.treinaweb.com.br/blog/categoria/seguranca-da-informacao) 

     9 anos atrás

    ##  [ Cross-Site Request Forgery (CSRF) e abordagens para mitigá-lo ](https://www.treinaweb.com.br/blog/cross-site-request-forgery-csrf-e-abordagens-para-mitiga-lo) 

     Entenda o que é Cross-Site Request Forgery (CSRF) e conheça abordagens para mitigá-lo, incluindo a mais moderna delas, que é o atributo SameSite para cookies.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/03/17012453/OAuth-2-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     7 anos atrás

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

     Confira neste artigo o que vem a ser o protoloco OAuth 2.

     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/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) 

     9 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

## 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 02min 54s**

- 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
