Basicamente, estou fazendo uma route da minha API, para trocar um token do usuário, porém, este só pode trocar entre períodos de 14 dias.
O código da route está assim >
const express = require('express');
const ms = require("parse-ms");
const authMiddleware = require('../middlewares/auth');
const router = express.Router();
const User = require('../../database/Schemas/User');
router.use(authMiddleware);
router.post('/token?:token', (req, res) => {
let token = req.params.token;
if(!token) {
return res.status(200).send({ erro: 'Bad request'});
}
User.findOne({ id: req.userID }, (err, user) => {
const cooldown = 1.21e+6;
const waitTime = user.waitTime;
if(!user.token) {
return res.status(400).send({ erro: "You don't have a token."})
}
if(waitTime !== null && cooldown - (Date.now() - waitTime) > 0) {
let time = ms(cooldown - (Date.now() - daily) > 0);
let days = time.days;
let hours = time.hours;
let minutes = time.minutes;
let seconds = time.seconds;
return res.status(400).send({erro: `Você deve esperar ${days <= 1 ? `1 dia` : `${days} dias`}, ${hours <= 1 ? `1 hora` : `${hours} horas`}, ${minutes <= 1 ? `1 minuto` : `${minutes} minutos`} e ${seconds} segundos para trocar seu token novamente.`})
} else {
try {
const result = User.findOneAndUpdate({ id: req.userData.id}, {$set: {token: token, waitTime: cooldown + Date.now()}}, {new: true})
return res.status(200).send({ id: req.userData.id, token: result.token})
} catch (error) {
return res.status(400).send({ error: 'Error changing token'})
}
};
})
})
module.exports = router;
Já o codigo do meu auth middleware, usando JWT, está assim >
const jwt = require('jsonwebtoken');
const authConfig = require('../../config/auth.json');
module.exports = (req, res, next) => {
const authHeader = req.headers.authorization;
if (!authHeader)
return res.status(401).send({ error: 'No token provided' });
const parts = authHeader.split(' ');
if (!(parts.length === 2))
return res.status(401).send({ error: 'Token error' });
const ( scheme, token ) = parts;
if (!/Bearer$/i.test(scheme))
return res.status(401).send({ error: 'Token malformatted' });
jwt.verify(token, authConfig.secret, (err, decoded) => {
if (err) return res.status(401).send({ error: 'Token invalid' });
req.userData = decoded;
return next();
});
};
O mais engraçado é que ele não retorna erro, apenas o ID do usuário em JSON e não muda nada na DB, e passa direto pela verificação se há um token.
Se alguém puder ajudar, grato!