Programação Bakend com
NodeJS
Autenticação e Middlewares
Prof. Mr. Fabio Abrantes Diniz
fabio.abrantes.diniz@gmail.com
Iniciando Projeto Backend
• Criar um projeto Backend
1. npm init -y
✓ Cria o package.json
2. Instalar as dependências de typescript
✓ npm i typescript –D
✓ Npm i @types/node - D
– Adicionou a dependência no package.json
– E adicionou pasta node_modules
3. Inicializar o Typescript
✓ npx tsc --init
– Gera o arquivo tsconfig.json
– Convertendo para Javascript
» npx tsc src/index.ts
Iniciando Projeto Backend
• Criar um projeto Backend
4. Node ainda não entende o typescript por padrão
✓ Configurar para converter ao javascript.
– Instalar a dependência
» npm install tsx –D
5. Conifgurar o package.json adicionando o script
▪ "dev": “tsx watch src/server.ts",
– Agora pode executar npm run dev no
terminal
Docker
• O que é?
▪ O Docker é uma plataforma de software que permite
✓ criar, testar e implantar aplicativos
✓ Empacotando software em unidades padronizadas
– chamadas contêineres
Docker
• O que é container?
Docker
• Containers
Docker
• Imagens
Docker
• Imagens
▪ Docker hub contém varias imagens disponíveis
✓https://hub.docker.com/
✓docker pull bitnami/postgresql
Docker
• Papel das Imagens e containers
Docker
• Vocabulário
Docker
• Vocabulário
Docker
• Quem está usando?
Docker
• Instalação:
▪ seguir as instruções oficiais disponíveis no site do Docker
✓https://docs.docker.com/get-docker/
✓ Crie uma conta no Docker Hub,
– É necessária para baixar as imagens
✓ E fazer login no Docker CLI.
Comandos Docker
• Comandos básicos
▪ docker run --name meunomeApp -p 3333:3333
nameImages
✓ é usado para criar e iniciar um container
✓Flag --name nome do container
✓Flag –p mapeamento das portas
▪ Posso passar variáveis ambiente com a flag -e
✓Se for um banco de dados por exemplo
– docker run --name bd-exemplo-pg -e
POSTGRESQL_USERNAME=docker -e
POSTGRESQL_PASSWORD=docker -e
POSTGRESQL_DATABASE=SolidDB -p 5432:5432
bitnami/postgresql
Comandos Docker
• Comandos básicos
▪ docker pull
✓utilizado para baixar uma imagem Docker do Docker
Hub ou de outro registro
▪ docker –v
✓Versao do docker
Comandos Docker
• Gerenciamento de containers
▪ docker ps
✓ lista todos os containers em execução
✓Adicionando a flag –a
– Lista todos os containers (parados e em
execução)
Comandos Docker
• Gerenciamento de containers
▪ docker stop [id ou nameContainer]
✓parar um container em execuçãoro
▪ Docker start [id ou nameContainer]
✓Inicia um container
▪ Docker rm [id ou nameContainer]
✓remove um ou mais containers.
– É importante garantir que o container esteja
parado antes de tentar removê-lo
Comandos Docker
• Gerenciamento de containers
▪ docker logs [id ou nameContainer] -f
✓Ver os logs que mostra da aplicação
▪ Docker exec -it [id ou nameContainer] /bin/bash
✓Mostra o container
– Se der o comando ls (mostra o que tem dentro
dele)
✓Cltr + d (sai do container)
Comandos Docker
• Trabalhando com imagens
▪ docker images
✓ lista todas as imagens Docker disponíveis localmente
▪ docker rmi [id]
✓remover uma imagem local
Docker-compose
• É uma ferramenta que permite definir e
executar aplicativos Docker multi-container
▪ Usando uma linguagem declarativa.
✓Dentro de um arquivo YAML
– Chamado docker-compose.yml
» Na raiz do projeto
– Configura os serviços necessários,
» bancos de dados,
» cache, filas de mensagens, entre outros.
Docker-compose
• Exemplo de docker-compose.yml
Comandos Docker-compose
• docker-compose up -d
▪ cria todos os serviços declarado no arquivo docker-
compose.yml em background
• docker-compose stop
▪ Vai parar todos os serviços (containers)
• docker-compose start
▪ Inicia todos todos os serviços (containers)
• docker-compose down
▪ Remove todos os serviços (containers) que foram criados
Extensão do Docker
• No Vs Code
Docker
• PostgreSQL com Docker
▪ Usar images do postgres no Docker hub
✓https://hub.docker.com/search
▪ Usaremos o postgres da bitnami
✓Images que se preocupa com a segurança
Docker
• PostgreSQL + node com Docker
▪ Usamos Docker composer
✓Colocar aqui imgens arquivos feitos no projeto
Autenticação
• Por que essa técnica é tão necessária
em aplicações de qualquer tipo?
Autenticação
• Cr
Autenticação
• Cr
Autenticação
• Cr
Autenticação
• Cr
Autorização
• Cr
Autorização
Tipos de Autenticação
• Autenticação por usuário e senha
Tipos de Autenticação
• Autenticação por Biometria
Tipos de Autenticação
• Autenticação em dois fatores
Tipos de Autenticação
• Autenticação por sessão
▪ Primeiro método de autenticação criado no início do
desenvolvimento de apps web
Tipos de Autenticação
• Autenticação por token
Autenticação por sessão versus token
JWT
• Na autenticação por sessão,
▪ O estado da sessão é mantido pelo servidor
– As informações do usuário armazenado em um banco
de dados ou na memória (Stateful).
• Autenticação por Token JWT,
▪ Informações não são mantidas no servidor
(Stateless),
✓Mantida no token, na máquina do cliente.
– Contendo informações para a autenticação,
» Identificação do usuário,
» assinatura, data de expiração,..
Escalando a aplicação com segurança
• O crescimento da aplicação deve ser ordenado
e suportado
▪ Não afetando a utilização do sistema (escalabilidade)
• Deve-se usar métodos de autenticação que
atendam a esse requisito
▪ garantindo assim maior segurança na utilização de sistemas.
Curiosidade!
• Passkey - Google libera método de login
que dispensa uso de senha
Json Web Token - JWT
• é um sistema de transferência de dados
que pode ser enviado
▪ via GET, POST ou em um cabeçalho HTTP
(header) de maneira "segura”
✓As informações são digitalmente assinadas por
criptografia
– Chave secreta HMAC (Hash-based Message
Authentication Code)
Json Web Token - JWT
• Para que serve?
▪ Autenticação: O token é utilizado para
verificar a identidade de um usuário e suas
permissões.
▪ Troca de informação: Por ser um meio
seguro para duas aplicações conversarem
✓graças a maneira que os tokens são assinados
digitalmente
Json Web Token - JWT
• Verificação de um token
▪ Com um token construído e seguro,
✓É matematicamente impossível decodificar a
assinatura sem ter o segredo-chave
1. Somente com posse do segredo,
»qualquer aplicação pode decodificar a
assinatura e verificar se ela é válida
2. As assinaturas sejam idênticas,
»O cliente tem acesso as áreas restritas
da nossa aplicação
Json Web Token - JWT
1
2
Json Web Token - JWT
• É preciso informar:
▪ O token no header Authorization da
requisição
✓E, por convenção, após a palavra Bearer.
Usando o Token
• Usando o Token
Json Web Token - JWT
• Como é por dentro?
▪ Três componentes básicos:
✓HEADER, PAYLOAD e SIGNATURE.
–https://jwt.io/
–https://jwt.io/introduction
Json Web Token - JWT
• HEADER
Json Web Token - JWT
• PAYLOAD
▪ atributos não obrigatórios que são usados na validação
do token pelos protocolos de segurança das APIs.
Json Web Token - JWT
• PAYLOAD
▪ atributos definidos especialmente para compartilhar
informações entre aplicações.
Json Web Token - JWT
• SIGNATURE
Json Web Token - JWT
• Construção de um token (Primeiro)
▪ Usando a Biblioteca
✓npm install jsonwebtoken
▪ Se o projeto Typescritp
✓npm install @types/jsonwebtoken - D
Criptografar o password
• Utilizar a biblioteca de criptografia para o
password
▪ npm install bcryptjs
✓npm install @types/bcryptjs –D
✓Importar a função hash do bcryptjs
–Depois criptografar o password
Json Web Token - JWT
• Construção de um token (Primeiro)
▪ Criar um User Case de autenticação
✓Vai ser reponsável para gerar o token
–Caso as infromações passada durante a
autenticação sejam válidas
»No caso email e password
✓Usamos o método compare() do bcrypts
–Comparar a senha digitada pelo usuário
com a que está armazenada no BD
Json Web Token - JWT
• Construção de um token (Primeiro)
▪ Criar um User Case de autenticação
✓Usamos o método sign() do jsonwebtoken
– sign(payload, secretOrPrivateKey, [options,
callback])
»Payload: objeto literal contendo uma
informação do usuário
»Nome do usuário.
»secretOrPrivateKey
» https://www.md5hashgenerator.com/
»Options: algoritmo, subject,
expiresIn,...
Fonte: https://github.com/auth0/node-jsonwebtoken
Json Web Token - JWT
• Construção de um token (Primeiro)
▪ Criar um User Case de autenticação
✓Usamos o método sign() do jsonwebtoken
Fonte: https://github.com/auth0/node-jsonwebtoken
Json Web Token - JWT
• Construção de um token (Primeiro)
▪ Criar um controlador para autenticação
▪ E adicionar a rota login
✓Chamando o método de autenticação do controlador
Introdução a funções de
middleware
• Middleware permite que, em vez de utilizar uma
única função enorme para lidar com todas as
requisições, o atendimento às requisições seja
dividido em funções menores
▪ Geralmente atendem a um aspecto por vez:
✓uma função para logging,
✓outra para interpretar valores especiais de requisições,
✓outra para autenticar usuários.
✓Verificar o token
✓...
Middleware
• Função de manipulação de requisição
(request handler) do Node, mas em vez de
uma, temos várias em sequência
• Usados para várias coisas:
▪ Um middleware faz registro de logging
▪ Outro adiciona cabeçalhos especiais à requisição
▪ etc.
Funcionamento de middleware
Funcionamento de middleware
Express e a pilha de middleware
• No Express, os objetos são decorados com
alguns utilitários e passados por uma pilha de
funções
Assinatura de uma função de
middleware
• function(request, response, next)
• O terceiro parâmetro é uma função que
chama o próximo middleware da pilha
• Em qualquer middleware da pilha, deve
haver uma única chamada a
▪ response.end (ou funções do Express) para
finalizar a requisição
Estendendo requisição e resposta
• O Express aumenta as propriedades e as
funções dos objetos da requisição e da
resposta
• Útil para:
▪ Enviar arquivos ao cliente
▪ Gerar respostas com cabeçalhos mais rapidamente
▪ Etc.
Middleware
• Modificação nas Rotas e server
▪ Utilizando Middleware no server
✓O que são?
– todo o tipo de função que está entre um pedido HTTP
e a resposta final
» que o servidor envia de volta para o cliente.
Middleware
• Modificação nas Rotas e server
▪ Utilizando Middleware no server
✓Portanto são funções
– Recebe 4 parâmetros
» Error, Request, Response e next()
✓Podem executar as seguintes tarefas
– Executar qualquer código.
» autenticação
– Fazer mudanças nos objetos de solicitação e
resposta.
– Encerrar o ciclo de solicitação-resposta.
» Ex: exceções
– Chamar o próximo middleware na pilha.
Middleware
• Modificação nas Rotas e server
▪ Utilizando Middleware no server
✓Usamos middleware para usar o arquivo router e json()
– app.use(router)
» Adicionar as rotas
– app.use(express.json())
» Para o server aceitar dados vindo da requisição no
formatod json
Tratando Exceções
• Duas formas
1. Usando o try-catch no controller
✓trow new Error(“erro!”)
– Lançar uma exceção para o controller
– controller → Service (throw new Error())
Introdução a funções de
middleware
• Middleware permite que, em vez de utilizar uma
única função enorme para lidar com todas as
requisições, o atendimento às requisições seja
dividido em funções menores
▪ Geralmente atendem a um aspecto por vez:
✓uma função para logging,
✓outra para interpretar valores especiais de requisições,
✓outra para autenticar usuários.
✓Verificar o token
✓...
Middleware
• Função de manipulação de requisição
(request handler) do Node, mas em vez de
uma, temos várias em sequência
• Usados para várias coisas:
▪ Um middleware faz registro de logging
▪ Outro adiciona cabeçalhos especiais à requisição
▪ etc.
Funcionamento de middleware
Funcionamento de middleware
Express e a pilha de middleware
• No Express, os objetos são decorados com
alguns utilitários e passados por uma pilha de
funções
Assinatura de uma função de
middleware
• function(request, response, next)
• O terceiro parâmetro é uma função que
chama o próximo middleware da pilha
• Em qualquer middleware da pilha, deve
haver uma única chamada a
▪ response.end (ou funções do Express) para
finalizar a requisição
Estendendo requisição e resposta
• O Express aumenta as propriedades e as
funções dos objetos da requisição e da
resposta
• Útil para:
▪ Enviar arquivos ao cliente
▪ Gerar respostas com cabeçalhos mais rapidamente
▪ Etc.
Middleware de erros
• Existe um segundo tipo de middleware, menos
utilizado, que são as funções de manipulação
de erros
• Para entrar em modo de erro algum
middleware da pilha deve chamar next com o
um argumento de erro:
▪ Next(new Error('Algo deu errado'))
• Em vez de três parâmetros, esse tipo de
middleware tem quatro, sendo o primeiro o
objeto de erro
Middleware de erros
Tratando Exceções
• Duas formas
2. Usando um middleware no server para tratar
os erros
✓server→routes→controller→ use case (throw new Erro)
✓Instalar a biblioteca express-async-erros
– yarn add express-async-errors
✓Depois importar no server
– Logo depois da importação do express
Fonte: https://www.npmjs.com/package/express-async-errors
Fonte: https://www.npmjs.com/package/express-async-errors
Tratando Exceções
• Criando middleware para tratar exceções
Tratando Exceções
• Customizando Errors
▪ Criando uma classe Errors
✓ A fim de parametrizar os tipos de erros
– E instanciar essa classe no middleware que trata os erros
– E nos Services que lançam os erros com o throw
Criando middleware de
autenticação
• Passos
▪ Receber o token do aplicativo ou site web
✓vamos configurar o insomnia para enviar o token
– Na aba Auth
» Seleciona Bearer token
▪ No Middleware, capturamos o token pela
requisição
✓request.headers.authorization
▪ Validar se token está preenchido
✓ Se não tive mandar uma resposta de erro
Criando middleware de
autenticação
• Passos
▪ Retirar o Bearer
✓Formato:
– Bearer u5943u55u6ortmlkgmvkxciyd903489500898
▪ Verificar se o token é válido (dentro trycatch)
✓Usar o método verify(token, secretKey) da lib
jsonwebtoken
– Retorna o payload
• Passos
▪ Adicionar informações a Requisição (Request)
✓Ex: inserir o subject contendo o id do usuário do payload
– request.user_id = sub;
✓Se tudo ocorrer bem o midleware permite o controller
sua função
– Usando o next()
▪ No typescript é necessário configurações
✓Criar uma pasta na src chamado @types/express
– Contendo um arquivo chamado index.d.ts
✓no arquivo tsconfig.json
– habilito "typeRoots": ["./src/@types"],
Criando middleware de
autenticação

introdução a docker e uso de middlware e autenticação com node

  • 1.
    Programação Bakend com NodeJS Autenticaçãoe Middlewares Prof. Mr. Fabio Abrantes Diniz fabio.abrantes.diniz@gmail.com
  • 2.
    Iniciando Projeto Backend •Criar um projeto Backend 1. npm init -y ✓ Cria o package.json 2. Instalar as dependências de typescript ✓ npm i typescript –D ✓ Npm i @types/node - D – Adicionou a dependência no package.json – E adicionou pasta node_modules 3. Inicializar o Typescript ✓ npx tsc --init – Gera o arquivo tsconfig.json – Convertendo para Javascript » npx tsc src/index.ts
  • 3.
    Iniciando Projeto Backend •Criar um projeto Backend 4. Node ainda não entende o typescript por padrão ✓ Configurar para converter ao javascript. – Instalar a dependência » npm install tsx –D 5. Conifgurar o package.json adicionando o script ▪ "dev": “tsx watch src/server.ts", – Agora pode executar npm run dev no terminal
  • 4.
    Docker • O queé? ▪ O Docker é uma plataforma de software que permite ✓ criar, testar e implantar aplicativos ✓ Empacotando software em unidades padronizadas – chamadas contêineres
  • 5.
    Docker • O queé container?
  • 6.
  • 7.
  • 8.
    Docker • Imagens ▪ Dockerhub contém varias imagens disponíveis ✓https://hub.docker.com/ ✓docker pull bitnami/postgresql
  • 9.
    Docker • Papel dasImagens e containers
  • 10.
  • 11.
  • 12.
  • 13.
    Docker • Instalação: ▪ seguiras instruções oficiais disponíveis no site do Docker ✓https://docs.docker.com/get-docker/ ✓ Crie uma conta no Docker Hub, – É necessária para baixar as imagens ✓ E fazer login no Docker CLI.
  • 14.
    Comandos Docker • Comandosbásicos ▪ docker run --name meunomeApp -p 3333:3333 nameImages ✓ é usado para criar e iniciar um container ✓Flag --name nome do container ✓Flag –p mapeamento das portas ▪ Posso passar variáveis ambiente com a flag -e ✓Se for um banco de dados por exemplo – docker run --name bd-exemplo-pg -e POSTGRESQL_USERNAME=docker -e POSTGRESQL_PASSWORD=docker -e POSTGRESQL_DATABASE=SolidDB -p 5432:5432 bitnami/postgresql
  • 15.
    Comandos Docker • Comandosbásicos ▪ docker pull ✓utilizado para baixar uma imagem Docker do Docker Hub ou de outro registro ▪ docker –v ✓Versao do docker
  • 16.
    Comandos Docker • Gerenciamentode containers ▪ docker ps ✓ lista todos os containers em execução ✓Adicionando a flag –a – Lista todos os containers (parados e em execução)
  • 17.
    Comandos Docker • Gerenciamentode containers ▪ docker stop [id ou nameContainer] ✓parar um container em execuçãoro ▪ Docker start [id ou nameContainer] ✓Inicia um container ▪ Docker rm [id ou nameContainer] ✓remove um ou mais containers. – É importante garantir que o container esteja parado antes de tentar removê-lo
  • 18.
    Comandos Docker • Gerenciamentode containers ▪ docker logs [id ou nameContainer] -f ✓Ver os logs que mostra da aplicação ▪ Docker exec -it [id ou nameContainer] /bin/bash ✓Mostra o container – Se der o comando ls (mostra o que tem dentro dele) ✓Cltr + d (sai do container)
  • 19.
    Comandos Docker • Trabalhandocom imagens ▪ docker images ✓ lista todas as imagens Docker disponíveis localmente ▪ docker rmi [id] ✓remover uma imagem local
  • 20.
    Docker-compose • É umaferramenta que permite definir e executar aplicativos Docker multi-container ▪ Usando uma linguagem declarativa. ✓Dentro de um arquivo YAML – Chamado docker-compose.yml » Na raiz do projeto – Configura os serviços necessários, » bancos de dados, » cache, filas de mensagens, entre outros.
  • 21.
  • 22.
    Comandos Docker-compose • docker-composeup -d ▪ cria todos os serviços declarado no arquivo docker- compose.yml em background • docker-compose stop ▪ Vai parar todos os serviços (containers) • docker-compose start ▪ Inicia todos todos os serviços (containers) • docker-compose down ▪ Remove todos os serviços (containers) que foram criados
  • 23.
  • 24.
    Docker • PostgreSQL comDocker ▪ Usar images do postgres no Docker hub ✓https://hub.docker.com/search ▪ Usaremos o postgres da bitnami ✓Images que se preocupa com a segurança
  • 25.
    Docker • PostgreSQL +node com Docker ▪ Usamos Docker composer ✓Colocar aqui imgens arquivos feitos no projeto
  • 26.
    Autenticação • Por queessa técnica é tão necessária em aplicações de qualquer tipo?
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
    Tipos de Autenticação •Autenticação por usuário e senha
  • 34.
    Tipos de Autenticação •Autenticação por Biometria
  • 35.
    Tipos de Autenticação •Autenticação em dois fatores
  • 36.
    Tipos de Autenticação •Autenticação por sessão ▪ Primeiro método de autenticação criado no início do desenvolvimento de apps web
  • 37.
    Tipos de Autenticação •Autenticação por token
  • 38.
    Autenticação por sessãoversus token JWT • Na autenticação por sessão, ▪ O estado da sessão é mantido pelo servidor – As informações do usuário armazenado em um banco de dados ou na memória (Stateful). • Autenticação por Token JWT, ▪ Informações não são mantidas no servidor (Stateless), ✓Mantida no token, na máquina do cliente. – Contendo informações para a autenticação, » Identificação do usuário, » assinatura, data de expiração,..
  • 39.
    Escalando a aplicaçãocom segurança • O crescimento da aplicação deve ser ordenado e suportado ▪ Não afetando a utilização do sistema (escalabilidade) • Deve-se usar métodos de autenticação que atendam a esse requisito ▪ garantindo assim maior segurança na utilização de sistemas.
  • 40.
    Curiosidade! • Passkey -Google libera método de login que dispensa uso de senha
  • 41.
    Json Web Token- JWT • é um sistema de transferência de dados que pode ser enviado ▪ via GET, POST ou em um cabeçalho HTTP (header) de maneira "segura” ✓As informações são digitalmente assinadas por criptografia – Chave secreta HMAC (Hash-based Message Authentication Code)
  • 42.
    Json Web Token- JWT • Para que serve? ▪ Autenticação: O token é utilizado para verificar a identidade de um usuário e suas permissões. ▪ Troca de informação: Por ser um meio seguro para duas aplicações conversarem ✓graças a maneira que os tokens são assinados digitalmente
  • 43.
    Json Web Token- JWT • Verificação de um token ▪ Com um token construído e seguro, ✓É matematicamente impossível decodificar a assinatura sem ter o segredo-chave 1. Somente com posse do segredo, »qualquer aplicação pode decodificar a assinatura e verificar se ela é válida 2. As assinaturas sejam idênticas, »O cliente tem acesso as áreas restritas da nossa aplicação
  • 44.
    Json Web Token- JWT 1 2
  • 45.
    Json Web Token- JWT • É preciso informar: ▪ O token no header Authorization da requisição ✓E, por convenção, após a palavra Bearer.
  • 46.
    Usando o Token •Usando o Token
  • 47.
    Json Web Token- JWT • Como é por dentro? ▪ Três componentes básicos: ✓HEADER, PAYLOAD e SIGNATURE. –https://jwt.io/ –https://jwt.io/introduction
  • 48.
    Json Web Token- JWT • HEADER
  • 49.
    Json Web Token- JWT • PAYLOAD ▪ atributos não obrigatórios que são usados na validação do token pelos protocolos de segurança das APIs.
  • 50.
    Json Web Token- JWT • PAYLOAD ▪ atributos definidos especialmente para compartilhar informações entre aplicações.
  • 51.
    Json Web Token- JWT • SIGNATURE
  • 52.
    Json Web Token- JWT • Construção de um token (Primeiro) ▪ Usando a Biblioteca ✓npm install jsonwebtoken ▪ Se o projeto Typescritp ✓npm install @types/jsonwebtoken - D
  • 53.
    Criptografar o password •Utilizar a biblioteca de criptografia para o password ▪ npm install bcryptjs ✓npm install @types/bcryptjs –D ✓Importar a função hash do bcryptjs –Depois criptografar o password
  • 54.
    Json Web Token- JWT • Construção de um token (Primeiro) ▪ Criar um User Case de autenticação ✓Vai ser reponsável para gerar o token –Caso as infromações passada durante a autenticação sejam válidas »No caso email e password ✓Usamos o método compare() do bcrypts –Comparar a senha digitada pelo usuário com a que está armazenada no BD
  • 55.
    Json Web Token- JWT • Construção de um token (Primeiro) ▪ Criar um User Case de autenticação ✓Usamos o método sign() do jsonwebtoken – sign(payload, secretOrPrivateKey, [options, callback]) »Payload: objeto literal contendo uma informação do usuário »Nome do usuário. »secretOrPrivateKey » https://www.md5hashgenerator.com/ »Options: algoritmo, subject, expiresIn,... Fonte: https://github.com/auth0/node-jsonwebtoken
  • 56.
    Json Web Token- JWT • Construção de um token (Primeiro) ▪ Criar um User Case de autenticação ✓Usamos o método sign() do jsonwebtoken Fonte: https://github.com/auth0/node-jsonwebtoken
  • 57.
    Json Web Token- JWT • Construção de um token (Primeiro) ▪ Criar um controlador para autenticação ▪ E adicionar a rota login ✓Chamando o método de autenticação do controlador
  • 58.
    Introdução a funçõesde middleware • Middleware permite que, em vez de utilizar uma única função enorme para lidar com todas as requisições, o atendimento às requisições seja dividido em funções menores ▪ Geralmente atendem a um aspecto por vez: ✓uma função para logging, ✓outra para interpretar valores especiais de requisições, ✓outra para autenticar usuários. ✓Verificar o token ✓...
  • 59.
    Middleware • Função demanipulação de requisição (request handler) do Node, mas em vez de uma, temos várias em sequência • Usados para várias coisas: ▪ Um middleware faz registro de logging ▪ Outro adiciona cabeçalhos especiais à requisição ▪ etc.
  • 60.
  • 61.
  • 62.
    Express e apilha de middleware • No Express, os objetos são decorados com alguns utilitários e passados por uma pilha de funções
  • 63.
    Assinatura de umafunção de middleware • function(request, response, next) • O terceiro parâmetro é uma função que chama o próximo middleware da pilha • Em qualquer middleware da pilha, deve haver uma única chamada a ▪ response.end (ou funções do Express) para finalizar a requisição
  • 64.
    Estendendo requisição eresposta • O Express aumenta as propriedades e as funções dos objetos da requisição e da resposta • Útil para: ▪ Enviar arquivos ao cliente ▪ Gerar respostas com cabeçalhos mais rapidamente ▪ Etc.
  • 65.
    Middleware • Modificação nasRotas e server ▪ Utilizando Middleware no server ✓O que são? – todo o tipo de função que está entre um pedido HTTP e a resposta final » que o servidor envia de volta para o cliente.
  • 66.
    Middleware • Modificação nasRotas e server ▪ Utilizando Middleware no server ✓Portanto são funções – Recebe 4 parâmetros » Error, Request, Response e next() ✓Podem executar as seguintes tarefas – Executar qualquer código. » autenticação – Fazer mudanças nos objetos de solicitação e resposta. – Encerrar o ciclo de solicitação-resposta. » Ex: exceções – Chamar o próximo middleware na pilha.
  • 67.
    Middleware • Modificação nasRotas e server ▪ Utilizando Middleware no server ✓Usamos middleware para usar o arquivo router e json() – app.use(router) » Adicionar as rotas – app.use(express.json()) » Para o server aceitar dados vindo da requisição no formatod json
  • 68.
    Tratando Exceções • Duasformas 1. Usando o try-catch no controller ✓trow new Error(“erro!”) – Lançar uma exceção para o controller – controller → Service (throw new Error())
  • 69.
    Introdução a funçõesde middleware • Middleware permite que, em vez de utilizar uma única função enorme para lidar com todas as requisições, o atendimento às requisições seja dividido em funções menores ▪ Geralmente atendem a um aspecto por vez: ✓uma função para logging, ✓outra para interpretar valores especiais de requisições, ✓outra para autenticar usuários. ✓Verificar o token ✓...
  • 70.
    Middleware • Função demanipulação de requisição (request handler) do Node, mas em vez de uma, temos várias em sequência • Usados para várias coisas: ▪ Um middleware faz registro de logging ▪ Outro adiciona cabeçalhos especiais à requisição ▪ etc.
  • 71.
  • 72.
  • 73.
    Express e apilha de middleware • No Express, os objetos são decorados com alguns utilitários e passados por uma pilha de funções
  • 74.
    Assinatura de umafunção de middleware • function(request, response, next) • O terceiro parâmetro é uma função que chama o próximo middleware da pilha • Em qualquer middleware da pilha, deve haver uma única chamada a ▪ response.end (ou funções do Express) para finalizar a requisição
  • 75.
    Estendendo requisição eresposta • O Express aumenta as propriedades e as funções dos objetos da requisição e da resposta • Útil para: ▪ Enviar arquivos ao cliente ▪ Gerar respostas com cabeçalhos mais rapidamente ▪ Etc.
  • 76.
    Middleware de erros •Existe um segundo tipo de middleware, menos utilizado, que são as funções de manipulação de erros • Para entrar em modo de erro algum middleware da pilha deve chamar next com o um argumento de erro: ▪ Next(new Error('Algo deu errado')) • Em vez de três parâmetros, esse tipo de middleware tem quatro, sendo o primeiro o objeto de erro
  • 77.
  • 78.
    Tratando Exceções • Duasformas 2. Usando um middleware no server para tratar os erros ✓server→routes→controller→ use case (throw new Erro) ✓Instalar a biblioteca express-async-erros – yarn add express-async-errors ✓Depois importar no server – Logo depois da importação do express Fonte: https://www.npmjs.com/package/express-async-errors Fonte: https://www.npmjs.com/package/express-async-errors
  • 79.
    Tratando Exceções • Criandomiddleware para tratar exceções
  • 80.
    Tratando Exceções • CustomizandoErrors ▪ Criando uma classe Errors ✓ A fim de parametrizar os tipos de erros – E instanciar essa classe no middleware que trata os erros – E nos Services que lançam os erros com o throw
  • 81.
    Criando middleware de autenticação •Passos ▪ Receber o token do aplicativo ou site web ✓vamos configurar o insomnia para enviar o token – Na aba Auth » Seleciona Bearer token ▪ No Middleware, capturamos o token pela requisição ✓request.headers.authorization ▪ Validar se token está preenchido ✓ Se não tive mandar uma resposta de erro
  • 82.
    Criando middleware de autenticação •Passos ▪ Retirar o Bearer ✓Formato: – Bearer u5943u55u6ortmlkgmvkxciyd903489500898 ▪ Verificar se o token é válido (dentro trycatch) ✓Usar o método verify(token, secretKey) da lib jsonwebtoken – Retorna o payload
  • 83.
    • Passos ▪ Adicionarinformações a Requisição (Request) ✓Ex: inserir o subject contendo o id do usuário do payload – request.user_id = sub; ✓Se tudo ocorrer bem o midleware permite o controller sua função – Usando o next() ▪ No typescript é necessário configurações ✓Criar uma pasta na src chamado @types/express – Contendo um arquivo chamado index.d.ts ✓no arquivo tsconfig.json – habilito "typeRoots": ["./src/@types"], Criando middleware de autenticação