SlideShare a Scribd company logo
1 of 37
Node.js + Express
Logging, Autenticação e Autorização
Bruno Catão
Antes de tudo
• Para organizar ainda mais nosso projeto
• Vamos adicionar o script de inicialização no package.json
• "start": "nodemon src/main.js“
• Para executar é só:
• npm start
Executando
npm start
> aula3@1.0.0 start
C:Usersbrunodevtap2019.1aula3
> nodemon src/main.js
[nodemon] 1.18.10
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node src/main.js`
body-parser deprecated undefined extended:...
Aplicação no ar em http://localhost:3000
Logging de Requisições
• Vamos utilizar o pacote Morgan
• https://github.com/expressjs/morgan
• Como será que instala ?
• npm i morgan --save
• Como usar ?
• Importar o módulo:
• const morgan = require('morgan')
• Escolher o formato: combined, common, dev, short, tiny
• app.use(morgan('combined’))
• É só isso!
Morgan
• Formatos predefinidos:
• combined
• :remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status
:res[content-length] ":referrer" ":user-agent"
• common
• :remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status
:res[content-length]
• dev
• :method :url :status :response-time ms - :res[content-length]
• short
• :remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] -
:response-time ms
• tiny
• :method :url :status :res[content-length] - :response-time ms
Morgan
• Por padrão, os logs são mostrados na saída padrão
• Para redirecionar os logs para um arquivo:
• É preciso importar os módulos fs (file system) e path
• const fs = require('fs')
• const path = require('path’)
• Depois, cria-se um stream de saída para o arquivo de logging:
• var logStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a’ })
• Configura o Morgan:
• app.use(morgan('combined', { stream: logStream }))
src/main.js
Saída
::1 - GET / HTTP/1.1 200 293 - 59.417 ms
::1 - GET /images/logo.jpg HTTP/1.1 304 - - 3.229 ms
::1 - GET /css/styles.css HTTP/1.1 304 - - 4.025 ms
::1 - GET /favicon.ico HTTP/1.1 200 3 - 1.049 ms
::1 - GET /livros HTTP/1.1 304 - - 1.093 ms
::1 - GET /favicon.ico HTTP/1.1 304 - - 0.700 ms
Logging de Código
• Existem vários pacotes
• Os mais usados são:
• Debug – Pacote simples, baseado em workspaces
• Winston – Pacote voltado para aplicações, contendo níveis de logging
• Trace – Logging para aplicações distribuídas, contendo microservices
Debug
• Instalação:
• npm i debug --save
• Uso:
• const debug = require('debug')(‘testes’);
• debug(‘produto = %o’, produto);
• Executando:
• DEBUG=testes node app.js
• Vantagens:
• Bom para testes (debugging)
• Na execução normal nenhuma saída é mostrada
• É possível utilizar vários workspaces para exibir saídas diferentes
Debug
• Sintaxe: debug(‘mensagem %fmt1 %fmt2’, valor1, valor2);
• Formatadores:
• %O – Objeto (em várias linhas)
• %o – Objeto (em uma única linha)
• %s - String
• %d - Número
• %j - JSON
• %% - Caractere de porcentagem (%)
Winston
• Logging de eventos da aplicação
• Suporte a vários níveis de logging
• Instalação:
• npm i winston --save
• Uso:
• const winston = require('winston’);
• winston.log('info', 'Hello log files!’, {someKey: 'some-value’});
• Sintaxe:
• winston.log(NIVEL, MENSAGEM, VALORES);
Winston
• Níveis de Severidade (RFC5424):
• error: 0
• warn: 1
• info: 2
• verbose: 3
• debug: 4
• silly: 5
• Um logger exibe mensagens de um nível menor ou igual ao seu
• Ex1. um logger com nível error exibe apenas mensagens error
• Ex2. um logger com nível silly exibe mensagens de todos os níveis
Winston
• Criando um logger:
const logger = winston.createLogger({
level: 'info',
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'meuslogs.log' })
]
});
Winston
• Criando um logger:
const logger = winston.createLogger({
level: 'silly',
transports: [
new winston.transports.Console({ level: 'silly' }),
new winston.transports.File({level: 'error' , filename: 'erros.log' }),
new winston.transports.File({filename: 'combinado.log' }),
]
});
Winston
• Criando um logger:
const logger = winston.createLogger({
level: 'info',
transports: [
new winston.transports.File({level: 'error' , filename: 'erros.log' }),
new winston.transports.File({filename: 'combinado.log' }),
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console());
}
No nosso projeto
• Vamos criar uma pasta config
• Dentro dela, vamos criar um script "logger.js"
• Esse script irá criar e configurar um logger, esse objeto poderá ser
utilizado em qualquer ponto da aplicação que precise registrar o que
está acontecendo
config/logger.js
Exemplo de uso
Saída
::1 - POST /livros HTTP/1.1 200 55 - 300.231 ms
::1 - GET /livros HTTP/1.1 200 57 - 1.747 ms
{"message":"Procurando o indice do livro com id 0","level":"info"}
::1 - GET /livros/0 HTTP/1.1 200 55 - 5.824 ms
::1 - GET /favicon.ico HTTP/1.1 304 - - 1.058 ms
{"message":"Procurando o indice do livro com id 3","level":"info"}
{"message":"Nao foi encontrado livro com id 3","level":"error"}
::1 - GET /livros/3 HTTP/1.1 200 - - 2.386 ms
::1 - GET /favicon.ico HTTP/1.1 304 - - 1.034 ms
Saída
Trace (PM2)
• Ferramenta paga
• Provê visualizações dos logs (organiza em árvores, cria gráficos, etc)
• Emite notificações (ex. em caso de exceções)
Trace (PM2)
JWT (JSON Web Tokens)
JWT – Como funciona ?
1. Você faz login
1. Se o login estiver correto, status 200, retorna um objeto com o token
2. Se o login estiver errado, status 500, retorna mensagem de erro
2. Tenta acessar uma URL segura
1. Verifica se no cabeçalho tem um atributo Authorization no formato:
Authorization: Bearer <token>
2. Se não tiver, status 401, mensagem de que não tem o token
3. Se tiver o token, tenta verificar ele
1. Não foi possível verificar o token, status 400, mensagem de erro
2. Token verificado, adiciona o payload do token no request e permite a entrada
Lista de códigos de status HTTP
• 200 – Sucesso
• 400 – Requisição inválida
• 401 – Não autorizado
• 402 – Pagamento necessário
• 403 – Proibido
• 404 – Não encontrado
• 500 – Erro interno do servidor
Implementando autenticação com JWT
• Primeiro passo, instalar o pacote jsonwebtoken:
• npm i jsonwebtoken --save
• Na pasta config, vamos criar um script "constantes.js"
• Vamos criar na pasta controllers um script "autorizacao.js"
• Vamos criar uma pasta "util" e um script "seguranca.js"
• Por fim, vamos dizer quais rotas de "livros.js" são seguras ou não.
config/constantes.js
controllers/autorizacao.js
main.js
util/seguranca.js
controllers/livros.js
Testando - Login
Testando – Rota aberta
Testando – Rota segura
Testando – Rota segura
Para a próxima aula
• Valendo pontos na primeira avaliação
• O projeto valerá 5 pontos
• Os outros 5 pontos restantes serão um somatório das atividades propostas em sala
• Com base nos exemplos das últimas aulas, faça um sistema com Node e
Express que:
• possua pelos menos dois perfis de usuário (ex. ADMIN e USER);
• tenha rotas públicas, rotas que todos os perfis autenticados possam acessar e todas
que apenas um perfil possa acessar (dica, use os dados do payload);
• armazena os dados de um recurso e dos usuários em um arquivo.

More Related Content

What's hot

Otimizando sites com o nosql redis
Otimizando sites com o nosql redisOtimizando sites com o nosql redis
Otimizando sites com o nosql redis
Allisson Azevedo
 

What's hot (19)

De A a Zabbix Devry Metrocamp
De A a Zabbix Devry MetrocampDe A a Zabbix Devry Metrocamp
De A a Zabbix Devry Metrocamp
 
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SPUserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
UserParameter vs Zabbix Sender - 1º ZABBIX MEETUP DO INTERIOR-SP
 
Vagrant + Puppet
Vagrant + PuppetVagrant + Puppet
Vagrant + Puppet
 
1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC
1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC
1º Meetup Zabbix Meetup do Recife: Francys Nivea - LLD ODBC
 
Docker + Django
Docker + DjangoDocker + Django
Docker + Django
 
Opennebula instalação
Opennebula instalaçãoOpennebula instalação
Opennebula instalação
 
Otimizando sites com o nosql redis
Otimizando sites com o nosql redisOtimizando sites com o nosql redis
Otimizando sites com o nosql redis
 
Criando um Website Cacheavel
Criando um Website CacheavelCriando um Website Cacheavel
Criando um Website Cacheavel
 
Docker para maiores
Docker para maioresDocker para maiores
Docker para maiores
 
Iniciando com docker
Iniciando com dockerIniciando com docker
Iniciando com docker
 
Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3
 
Django deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produçãoDjango deploy - Como servir aplicações Django em produção
Django deploy - Como servir aplicações Django em produção
 
Delphi Parallel Programming Library
Delphi Parallel Programming LibraryDelphi Parallel Programming Library
Delphi Parallel Programming Library
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida real
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
MEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon MeetupMEO Cloud - Python Lisbon Meetup
MEO Cloud - Python Lisbon Meetup
 
1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...
1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...
1º Meetup Zabbix Meetup do Recife: Danilo Barros - Zabbix dicas e truques par...
 
Opennebula Introdução
Opennebula IntroduçãoOpennebula Introdução
Opennebula Introdução
 
Vagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoVagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolso
 

Similar to Node JS - Parte 3

Similar to Node JS - Parte 3 (20)

Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Tutorial servidor debian linux ocs invetory
Tutorial servidor debian linux ocs invetory Tutorial servidor debian linux ocs invetory
Tutorial servidor debian linux ocs invetory
 
Desafio Rest API
Desafio Rest APIDesafio Rest API
Desafio Rest API
 
Python 08
Python 08Python 08
Python 08
 
Nagios monitoring - tech talk
Nagios monitoring  - tech talkNagios monitoring  - tech talk
Nagios monitoring - tech talk
 
Python 06
Python 06Python 06
Python 06
 
Vale Security Conference - 2011 - 6 - Thiago Bordini
Vale Security Conference - 2011 - 6 - Thiago BordiniVale Security Conference - 2011 - 6 - Thiago Bordini
Vale Security Conference - 2011 - 6 - Thiago Bordini
 
Tutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper jsTutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper js
 
Tutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSTutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJS
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1
 
Técnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoTécnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em django
 
Consegi 2011: Puppet
Consegi 2011: PuppetConsegi 2011: Puppet
Consegi 2011: Puppet
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
Aula de Node
Aula de NodeAula de Node
Aula de Node
 
Workshop Magento
Workshop MagentoWorkshop Magento
Workshop Magento
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Instalar Ocomon Ubuntu 2
Instalar Ocomon Ubuntu 2Instalar Ocomon Ubuntu 2
Instalar Ocomon Ubuntu 2
 
Iniciando com django
Iniciando com djangoIniciando com django
Iniciando com django
 

More from Bruno Catão

Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)
Bruno Catão
 
Introdução ao Framework Grails
Introdução ao Framework GrailsIntrodução ao Framework Grails
Introdução ao Framework Grails
Bruno Catão
 

More from Bruno Catão (19)

Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2
 
Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2
 
React JS - Parte 2
React JS - Parte 2React JS - Parte 2
React JS - Parte 2
 
React JS - Parte 1
React JS - Parte 1React JS - Parte 1
React JS - Parte 1
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + Firebase
 
Retina e Retinose Pigmentar
Retina e Retinose PigmentarRetina e Retinose Pigmentar
Retina e Retinose Pigmentar
 
Angular js
Angular jsAngular js
Angular js
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
Web Offline
Web OfflineWeb Offline
Web Offline
 
Python 07
Python 07Python 07
Python 07
 
Python 05
Python 05Python 05
Python 05
 
Python 04
Python 04Python 04
Python 04
 
Python 03
Python 03Python 03
Python 03
 
Python 02
Python 02Python 02
Python 02
 
Python 01
Python 01Python 01
Python 01
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)
 
Introdução ao Framework Grails
Introdução ao Framework GrailsIntrodução ao Framework Grails
Introdução ao Framework Grails
 
O framework spring
O framework springO framework spring
O framework spring
 

Node JS - Parte 3

  • 1. Node.js + Express Logging, Autenticação e Autorização Bruno Catão
  • 2. Antes de tudo • Para organizar ainda mais nosso projeto • Vamos adicionar o script de inicialização no package.json • "start": "nodemon src/main.js“ • Para executar é só: • npm start
  • 3. Executando npm start > aula3@1.0.0 start C:Usersbrunodevtap2019.1aula3 > nodemon src/main.js [nodemon] 1.18.10 [nodemon] to restart at any time, enter `rs` [nodemon] watching: *.* [nodemon] starting `node src/main.js` body-parser deprecated undefined extended:... Aplicação no ar em http://localhost:3000
  • 4. Logging de Requisições • Vamos utilizar o pacote Morgan • https://github.com/expressjs/morgan • Como será que instala ? • npm i morgan --save • Como usar ? • Importar o módulo: • const morgan = require('morgan') • Escolher o formato: combined, common, dev, short, tiny • app.use(morgan('combined’)) • É só isso!
  • 5. Morgan • Formatos predefinidos: • combined • :remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent" • common • :remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] • dev • :method :url :status :response-time ms - :res[content-length] • short • :remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms • tiny • :method :url :status :res[content-length] - :response-time ms
  • 6. Morgan • Por padrão, os logs são mostrados na saída padrão • Para redirecionar os logs para um arquivo: • É preciso importar os módulos fs (file system) e path • const fs = require('fs') • const path = require('path’) • Depois, cria-se um stream de saída para o arquivo de logging: • var logStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a’ }) • Configura o Morgan: • app.use(morgan('combined', { stream: logStream }))
  • 8. Saída ::1 - GET / HTTP/1.1 200 293 - 59.417 ms ::1 - GET /images/logo.jpg HTTP/1.1 304 - - 3.229 ms ::1 - GET /css/styles.css HTTP/1.1 304 - - 4.025 ms ::1 - GET /favicon.ico HTTP/1.1 200 3 - 1.049 ms ::1 - GET /livros HTTP/1.1 304 - - 1.093 ms ::1 - GET /favicon.ico HTTP/1.1 304 - - 0.700 ms
  • 9. Logging de Código • Existem vários pacotes • Os mais usados são: • Debug – Pacote simples, baseado em workspaces • Winston – Pacote voltado para aplicações, contendo níveis de logging • Trace – Logging para aplicações distribuídas, contendo microservices
  • 10. Debug • Instalação: • npm i debug --save • Uso: • const debug = require('debug')(‘testes’); • debug(‘produto = %o’, produto); • Executando: • DEBUG=testes node app.js • Vantagens: • Bom para testes (debugging) • Na execução normal nenhuma saída é mostrada • É possível utilizar vários workspaces para exibir saídas diferentes
  • 11. Debug • Sintaxe: debug(‘mensagem %fmt1 %fmt2’, valor1, valor2); • Formatadores: • %O – Objeto (em várias linhas) • %o – Objeto (em uma única linha) • %s - String • %d - Número • %j - JSON • %% - Caractere de porcentagem (%)
  • 12. Winston • Logging de eventos da aplicação • Suporte a vários níveis de logging • Instalação: • npm i winston --save • Uso: • const winston = require('winston’); • winston.log('info', 'Hello log files!’, {someKey: 'some-value’}); • Sintaxe: • winston.log(NIVEL, MENSAGEM, VALORES);
  • 13. Winston • Níveis de Severidade (RFC5424): • error: 0 • warn: 1 • info: 2 • verbose: 3 • debug: 4 • silly: 5 • Um logger exibe mensagens de um nível menor ou igual ao seu • Ex1. um logger com nível error exibe apenas mensagens error • Ex2. um logger com nível silly exibe mensagens de todos os níveis
  • 14. Winston • Criando um logger: const logger = winston.createLogger({ level: 'info', transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'meuslogs.log' }) ] });
  • 15. Winston • Criando um logger: const logger = winston.createLogger({ level: 'silly', transports: [ new winston.transports.Console({ level: 'silly' }), new winston.transports.File({level: 'error' , filename: 'erros.log' }), new winston.transports.File({filename: 'combinado.log' }), ] });
  • 16. Winston • Criando um logger: const logger = winston.createLogger({ level: 'info', transports: [ new winston.transports.File({level: 'error' , filename: 'erros.log' }), new winston.transports.File({filename: 'combinado.log' }), ] }); if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console()); }
  • 17. No nosso projeto • Vamos criar uma pasta config • Dentro dela, vamos criar um script "logger.js" • Esse script irá criar e configurar um logger, esse objeto poderá ser utilizado em qualquer ponto da aplicação que precise registrar o que está acontecendo
  • 20. Saída ::1 - POST /livros HTTP/1.1 200 55 - 300.231 ms ::1 - GET /livros HTTP/1.1 200 57 - 1.747 ms {"message":"Procurando o indice do livro com id 0","level":"info"} ::1 - GET /livros/0 HTTP/1.1 200 55 - 5.824 ms ::1 - GET /favicon.ico HTTP/1.1 304 - - 1.058 ms {"message":"Procurando o indice do livro com id 3","level":"info"} {"message":"Nao foi encontrado livro com id 3","level":"error"} ::1 - GET /livros/3 HTTP/1.1 200 - - 2.386 ms ::1 - GET /favicon.ico HTTP/1.1 304 - - 1.034 ms
  • 22. Trace (PM2) • Ferramenta paga • Provê visualizações dos logs (organiza em árvores, cria gráficos, etc) • Emite notificações (ex. em caso de exceções)
  • 24. JWT (JSON Web Tokens)
  • 25. JWT – Como funciona ? 1. Você faz login 1. Se o login estiver correto, status 200, retorna um objeto com o token 2. Se o login estiver errado, status 500, retorna mensagem de erro 2. Tenta acessar uma URL segura 1. Verifica se no cabeçalho tem um atributo Authorization no formato: Authorization: Bearer <token> 2. Se não tiver, status 401, mensagem de que não tem o token 3. Se tiver o token, tenta verificar ele 1. Não foi possível verificar o token, status 400, mensagem de erro 2. Token verificado, adiciona o payload do token no request e permite a entrada
  • 26. Lista de códigos de status HTTP • 200 – Sucesso • 400 – Requisição inválida • 401 – Não autorizado • 402 – Pagamento necessário • 403 – Proibido • 404 – Não encontrado • 500 – Erro interno do servidor
  • 27. Implementando autenticação com JWT • Primeiro passo, instalar o pacote jsonwebtoken: • npm i jsonwebtoken --save • Na pasta config, vamos criar um script "constantes.js" • Vamos criar na pasta controllers um script "autorizacao.js" • Vamos criar uma pasta "util" e um script "seguranca.js" • Por fim, vamos dizer quais rotas de "livros.js" são seguras ou não.
  • 37. Para a próxima aula • Valendo pontos na primeira avaliação • O projeto valerá 5 pontos • Os outros 5 pontos restantes serão um somatório das atividades propostas em sala • Com base nos exemplos das últimas aulas, faça um sistema com Node e Express que: • possua pelos menos dois perfis de usuário (ex. ADMIN e USER); • tenha rotas públicas, rotas que todos os perfis autenticados possam acessar e todas que apenas um perfil possa acessar (dica, use os dados do payload); • armazena os dados de um recurso e dos usuários em um arquivo.