From 6a0dd53574fa156f0ad87fae40a63eab8a82f61a Mon Sep 17 00:00:00 2001 From: Yutsuo Date: Thu, 20 Dec 2018 13:07:13 -0200 Subject: [PATCH] Phase III Task 4 --- README.md | 14 +++++++++++- docker-compose.yml | 6 +++++ node/app.js | 55 +++++++++++++++++++++++++++++++++++++++------- node/package.json | 3 ++- 4 files changed, 68 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 79db961..31facb7 100755 --- a/README.md +++ b/README.md @@ -8,4 +8,16 @@ Segunda tarefa: Crie uma página HTML que solicite usuário/senha, invoque o serviço da primeira tarefa e mostre a mensagem "Autenticado com sucesso" ou "Falha na autenticação". -Essa página deve estar em um segundo container e servida por NGINX. Mande o print da sua tela! \ No newline at end of file +Essa página deve estar em um segundo container e servida por NGINX. Mande o print da sua tela! + +Terceira tarefa: + +Faça com que a geração de token (/token) para o usuário 'power', com senha 'weak', inclua no token JWT o scope "admin". + +Quarta tarefa: + +Crie um endpoint REST '/restricted' que receba o token JWT e retorne o JSON "{message:'You have access to restricted contents!'} caso o token tenha scope "admin". Crie uma página HTML também que mostre essa mensagem retornada pelo serviço. Mande prints de telas mostrando acesso ao conteúdo com sucesso e sem sucesso. + +Quinta tarefa: + +Altere o serviço '/restricted' e adicione ao cabeçalho HTTP de retorno 'HOSTNAME=[container-hostname]' para identificarmos a instância do container que atendeu à requisição. Mande o print da chamada cURL mostrando esse cabeçalho HTTP na resposta. \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 1cc0978..c1d447a 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,6 +36,12 @@ services: networks: - network_1 # - network_2 + deploy: + resources: + limits: + memory: 50M + reservations: + memory: 20M mongo: container_name: mongo build: ./mongo diff --git a/node/app.js b/node/app.js index 894e3ca..130c695 100755 --- a/node/app.js +++ b/node/app.js @@ -10,6 +10,10 @@ const fs = require('file-system'); const marked = require('marked'); const jwt = require('jsonwebtoken'); const bodyParser= require('body-parser'); +// const morgan = require('morgan'); + +// use morgan to log requests to the console +// app.use(morgan('dev')); // database connection (with retries) const options = { @@ -85,16 +89,22 @@ app.get('/metrics2', function(req, res){ }) // JWT generation +var claims = { scope: 'admin' }; // app.use(express.json()); app.use(bodyParser.urlencoded({ extended: false })); app.post('/token', function(req, res){ console.log(req.body); - console.log(req.body.username); - console.log(req.body.password); - if (req.body.username=='user1') { - if (req.body.password=='pass1') { - var token = jwt.sign(req.body, 'wowmuchsecretveryhiddenwow'); + console.log('username: ' + req.body.username); + console.log('password: ' + req.body.password); + if (req.body.username === 'user1') { + if (req.body.password === 'pass1') { + // var token = jwt.sign(req.body, 'wowmuchsecretveryhiddenwow'); + var token = jwt.sign({ + username: req.body.username, + password: req.body.password + }, 'wowmuchsecretveryhiddenwow'); console.log(token); + console.log(jwt.decode(token)); // res.json(token); // res.status(200).json({ // success: 'SUCCESS! You\'re in.', @@ -102,15 +112,44 @@ app.post('/token', function(req, res){ // }); res.redirect('http://localhost/yay.html'); } else { - // res.status(500).send('this is not the password I expected'); + // res.status(500).send('wrong password'); res.redirect('http://localhost/nay.html'); } } else { - // res.status(500).send('this is not the user I want'); - res.redirect('http://localhost/nay.html'); + if (req.body.username === 'power') { + if (req.body.password === 'weak') { + var token = jwt.sign({ + subject: 'power#9123741', + issuer: 'http://youcantrustme.io', + scope: 'admin' + }, 'wowmuchsecretveryhiddenwow'); + console.log('JWT Token: ' + token); + console.log(jwt.decode(token)); + req.headers['access-token'] = token; + res.redirect('http://localhost/yay.html'); + + } else { + res.redirect('http://localhost/nay.html'); + } + } else { + // res.status(500).send('user not found'); + res.redirect('http://localhost/nay.html'); + } + console.log('\x1b[36m%s\x1b[0m','HEADER (req.headers): ' + req.headers['access-token']); } }); +const restrictRoutes = express.Router(); +app.use('/restricted', restrictRoutes); + +restrictRoutes.use((req, res, next) => {}); + +// app.post('/token2', function(req, res){ +// switch (req.body.username) { + +// } +// }) + // Default message for testing app.get('/', (req, res)=>{ res.json([{message:'yes, your nodejs app is really running'}]); diff --git a/node/package.json b/node/package.json index fe67356..ea7365d 100755 --- a/node/package.json +++ b/node/package.json @@ -20,6 +20,7 @@ "file-system": "^2.2.2", "marked": "^0.5.2", "body-parser": "^1.18.3", - "jsonwebtoken": "^8.4.0" + "jsonwebtoken": "^8.4.0", + "morgan": "^1.9.1" } }