const crypto = require('crypto'); const express = require('express'); const fileUpload = require('express-fileupload'); const morgan = require('morgan'); const app = express(); const mockUsers = require('./users.json'); app.use(fileUpload()); app.use(morgan('dev')); /** * Valida o cabeçalho Authorization */ app.use(function(req, res, next) { if (req.method.toUpperCase() == 'POST' && req.path == '/auth_upload') { if (!req.get('authorization')) { res.status(401).json({ msg: 'Header Authorization is invalid' }).end(); } } next(); }) /** * Valida usuário */ app.use(function(req, res, next) { if (req.method == 'POST' && req.path == '/auth_upload') { const [, AccessKeyId, Signature] = req.get('authorization').match(/([\w]+):([\w]+)/i) const userFiltered = mockUsers.filter((item) => item.AccessKeyId == AccessKeyId); if (!userFiltered || userFiltered.length == 0) { res.status(401).json({ msg: 'User not found' }).end(); } req.user = userFiltered[0]; req.signature = Signature; } next(); }) app.post('/auth_upload', (req, res, next) => { if (!req.files?.file) { res.status(401).end(); } const StringToSign = `${req.method}\n${req.files.file.md5}\n${req.files.file.mimetype}\n${req.get('date')}`; const HMacHash = crypto.createHmac('sha1', req.user.YourSecretAccessKey).update(StringToSign).digest('hex'); let statusCode = 401; if ( req.signature === HMacHash ) { statusCode = 200; } res.status(statusCode).end(); }); app.listen(80, '0.0.0.0', () => console.log(`Start server ${new Date().toLocaleString()}`))