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

  Termina em   Tempo restante da oferta: 01 Horas 

 54 Min 

 48 Seg 

   Tempo restante da oferta: 01 54 48 

  [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: Geração de Token JWT 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: Geração 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.

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

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

Vamos começar uma série de artigos sobre Autenticação JWT com NestJS abordando os pontos como: geração de Token JWT, proteção de rotas, autorização e “refresh token”.

Neste artigo vamos começar a utilizar a autenticação [JWT (JSON Web Token)](https://jwt.io/ "JWT (JSON Web Token)") com o [NestJS](https://www.treinaweb.com.br/blog/o-que-e-nestjs) para a geração de Tokens utilizando a biblioteca [Passport](https://www.passportjs.org/ "Passport") que é recomendada pela própria [documentação do NestJS](https://docs.nestjs.com/security/authentication "documentação do NestJS indica"), pois o Passport é uma biblioteca muito utilizada e confiável do ecossistema [NodeJS](https://www.treinaweb.com.br/blog/instalacao-do-node-js-windows-mac-e-linux).

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

Antes de tudo, aconselho a leitura do artigo “[Criando primeiro Crud com NestJS](https://www.treinaweb.com.br/blog/criando-o-primeiro-crud-com-nestjs "Criando primeiro Crud com NestJS")”, onde criamos um sistema de cadastro de usuário que podemos reaproveitá-lo neste artigo. Você pode clonar o projeto no seguinte repositório do GitHub: https://github.com/wesleygado/artigo-crud-nestjs. Também recomendo a leitura dos artigos “[O que é JWT?](https://www.treinaweb.com.br/blog/o-que-e-jwt)” e “[Fluxo de autenticação baseado em JWT](https://www.treinaweb.com.br/blog/fluxo-de-autenticacao-baseado-em-jwt)” caso não conheça o que é o JWT e como podemos utiliza-lo para realizar autenticação em nossas aplicações.

Perfeito, com o projeto anterior já configurado vamos fazer algumas alterações, a primeira é excluir o arquivo do banco anterior, que está localizado em `.db/sql` e adicionar a propriedade `password` na entidade `users` e no DTO, outra alteração é trocar a propriedade `idade` por `email` sendo uma string, o email será o nome de usuário (username) que vamos utilizar para efetuar a autenticação do usuário, desta forma:

```tsx
//user.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn('increment')
  id: number;

  @Column()
  nome: string;

  @Column()
  email: string;

  @Column()
  password: string;
}

```

Desta forma alterando também no DTO:

```tsx
//create-user.dto.ts
export class CreateUserDto {
  nome: string;
  email: string;
  password: string;
}

```

Desta forma agora temos cada usuário possuindo uma senha, vale salientar que em uma **[aplicação real é importante utilizar meios de criptografia de senha, como o bcrypt](https://docs.nestjs.com/security/encryption-and-hashing "aplicação real é importante utilizar meios de criptografia de senha, como o bcrypt")**. Aqui estamos salvando a senha simples no banco para fins didáticos e também focarmos em como a autenticação JWT funciona e na geração do Token.

Agora o segundo passo é instalar o pacote Passport, pacote este que facilitará a configuração da autenticação, você pode saber mais sobre ele na própria documentação.

Para instalar basta digitarmos os comandos:

```
npm install @nestjs/jwt passport-jwt
npm install --save-dev @types/passport-jwt
npm install @nestjs/passport passport passport-local
npm install --save-dev @types/passport-local

```

Agora temos os pacotes necessários para a implementação do JWT. Logo em seguida vamos criar o diretório `auth` em `src`, criar um módulo em `/auth` o seus respectivos `service` e `controller`:

```
nest g module auth
nest g service auth
nest g controller auth

```

Com os arquivos criados, vamos configurar o `auth.service.ts`, desta forma:

```tsx
//auth.service.ts
import {
  Injectable,
  NotAcceptableException,
  UnauthorizedException,
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { User } from 'src/users/entities/user.entity';
import { UsersService } from 'src/users/users.service';

@Injectable()
export class AuthService {
  constructor(
    private readonly usersService: UsersService,
    private jwtService: JwtService,
  ) {}
  async validarUsuario(username: string, password: string): Promise {
    const user = await this.usersService.findOneByEmail(username);
    if (!user) {
      throw new UnauthorizedException('Usuário ou Senha Inválidos');
    }
    if (user.password === password) {
      return await this.gerarToken(user);
    }
    throw new UnauthorizedException('Usuário ou Senha Inválidos');
  }

  async gerarToken(payload: User) {
    return {
      access_token: this.jwtService.sign(
        { email: payload.email },
        {
          secret: 'topSecret512',
          expiresIn: '50s',
        },
      ),
    };
  }
}

```

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

Criamos dois métodos, o método `validarUsuario`, como diz o nome, para validar o usuário, e o método `gerarToken`. No método `validarUsuario` vamos efetuar a busca pelo usuário recebendo via corpo da requisição o `username` e o `password`, logo em seguida, verificar se esse usuário existe e então confirmar se a senha está correta.

No método `gerarToken` vamos receber o usuário caso esteja tudo ok, e então utilizaremos o `jwtService.sign`, esse método faz parte do pacote do Passporte, que permite gerar tokens com diversas opções, neste caso, vamos utilizar duas propriedade:

- secret: Confirma que é a nossa aplicação que está fazendo a geração do token, caso uma aplicação terceira tente gerar um token, essa aplicação não saberá que é a chave base para a geração do token.
- expiresIn: O tempo de duração do Token, podemos selecionar um tempo para que esse token deixe de ser válido, desta forma sendo necessário gerar outro token, permitindo que não seja utilizado de forma maliciosa caso algum atacante tenha acesso a esse Token

**Obs**: no artigo passamos a secret direto na propriedade, porém é importante que para esses dados sensíveis sejam utilizados as variáveis de ambiente.

Outro ponto que não pode passar despercebido é que temos o método `findOnByEmail` recebendo o `username` como parâmetro, porém não temos ele em nosso `usersService`, para isto, vamos criar um novo método de busca de usuário por email no arquivo `users.service.ts`:

```tsx
//users.service.ts
//[...]
findOneByEmail(username: string) {
    return this.userRepository.findOneBy({ email: username });
  }
//[...]

```

Ótimo! O arquivo `auth.service.ts` está configurado.

A próxima etapa é criar o arquivo `local.auth.ts`, neste arquivo vamos configurar a estratégia de autenticação do Passport, ele possibilita a configuração de várias estratégias que podem ser consultadas na sua documentação e então escolhidas conforme a sua necessidade. Neste caso vamos selecionar a estratégia local e o JWT, o arquivo `local.auth.ts` ficará da seguinte forma:

```tsx
//local.auth.ts
import { Strategy } from 'passport-local';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthService } from './auth.service';

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor(private authService: AuthService) {
    super();
  }

  async validate(username: string, password: string): Promise {
    const user = await this.authService.validateUser(username, password);
    if (!user) {
      throw new UnauthorizedException();
    }
    return user;
  }
}

```

Com o `auth.service` e `local.auth.ts` configurados, precisamos adicionar os imports e providers no módulo auth:

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

@Module({
  imports: [
    TypeOrmModule.forFeature([User]),
    PassportModule,
    JwtModule,
  ],
  providers: [AuthService, UsersService, LocalStrategy],
})
export class AuthModule {}

```

No módulo basicamente vamos importar o `TypeOrmModule` pois precisamos utilizar a busca do usuário no banco, o `PassportModule` e o `JwtModule` que são os responsáveis pela autenticação. Nos providers vamos utilizar o `UsersService` e o `LocalStrategy`, que devem ser adicionados.

Neste momento precisamos configurar a rota no `auth.controller`:

```tsx
//auth.controller.ts
import { Controller, Post, Body } from '@nestjs/common';
import { AuthService } from './auth.service';

@Controller()
export class AuthController {
  constructor(private authService: AuthService) {}

  @Post('auth/login')
  async login(@Body() body) {
    return this.authService.validarUsuario(body.username, body.pass);
  }
}

```

Portanto teremos a rota POST para `/auth/login`, passando o `username` e `pass` via body chamando o método `validarUsuario` do `authService` para efetuar a validação e geração do Token.

Agora podemos testar a aplicação e gerar o Token JWT que será consumido, para testar a aplicação vamos utilizar o software [Insomnia](https://insomnia.rest/):

![Gerando token JWT](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/gerando-token-JWT.png)

Fizemos a requisição POST passando via body os dados do usuário e o Token JWT foi gerado com sucesso. Podemos testar também o cenário caso não encontre o usuário ou que os dados estejam incorretos:

![Simulando Erro 401 de Autenticação](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/erro-401-autenticacao.png)

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

Com o NestJS podemos utilizar a biblioteca Passport do ecossistema NodeJS para trabalhar com autenticação, recurso importante que garante segurança e uma série de possibilidades para o desenvolvimento de suas aplicações. Neste momento fizemos uma introdução à autenticação para a geração de Tokens JWT, continuando a série deste artigo, veremos em breve como utilizar a proteção de rotas e autorização.

Ah, antes que me esqueça, a aplicação do projeto pode ser acessada pelo [repositório do github](https://github.com/wesleygado/artigo-jwt-nest "repositório do github") para sanar qualquer dúvida :)

Nesse artigo criamos uma aplicação para a geração de Tokens JWT com NestJS, mas isso é apenas o começo, existem muitos outros recursos e funcionalidades disponíveis neste incrível framework, caso queira aprender mais sobre NestJS saiba que aqui na [TreinaWeb](https://www.treinaweb.com.br/) nós temos o curso [NestJS - Fundamentos](https://www.treinaweb.com.br/curso/nestjs-fundamentos) que possui **02h07 de videos** 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 NestJS - 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)
- [ #TypeScript ](https://www.treinaweb.com.br/blog/tag/typescript)
- [ #Autenticação ](https://www.treinaweb.com.br/blog/tag/autenticacao)
- [ #JWT ](https://www.treinaweb.com.br/blog/tag/jwt)
- [ #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: 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/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/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/2018/10/30133314/swagger-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     8 anos atrás

    ##  [ Documentando uma ASP.NET Core Web API com o Swagger ](https://www.treinaweb.com.br/blog/documentando-uma-asp-net-core-web-api-com-o-swagger) 

     Aprenda a documentar uma aplicação ASP .NET Core Web API com o Swagger.

     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/2018/10/30133314/swagger-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     7 anos atrás

    ##  [ Documentando uma API Spring Boot com o Swagger ](https://www.treinaweb.com.br/blog/documentando-uma-api-spring-boot-com-o-swagger) 

     Porque documentar uma aplicação API Spring Boot com o Swagger? Quando se trabalha em equipe, uma má documentação pode dificultar (e muito) o trabalho dos demais desenvolvedores. Mas com o Swagger, via SpringFox, é possível documentar uma API Spring Boot com poucas linhas de código.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/09/04112944/DJANGO-PROJETOS-PYCHARM-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     3 anos atrás

    ##  [ Como criar comandos customizados no Django ](https://www.treinaweb.com.br/blog/como-criar-comandos-customizados-no-django) 

     Aprenda a criar comandos customizados no Django para automatizar tarefas, personalizar funcionalidades e integrar sistemas externos!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/08/DEPLOY-SPRING-DIGITAL-OCEAN-400x280.jpg)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     3 anos atrás

    ##  [ Deploy de uma aplicação Spring Boot na DigitalOcean ](https://www.treinaweb.com.br/blog/deploy-de-uma-aplicacao-spring-boot-na-digitalocean) 

     Aprenda nesse artigo como realizar o Deploy de uma aplicação Spring Boot em uma VPS da DigitalOcena, usando ferramentas como o Nginx.

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

## 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  **01h 54min 48s**

- 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
