Я пытаюсь построить некоторые остальные API-интерфейсы с использованием узла express и mongoDB. Мне удалось создать jsonwebtoken после входа пользователя. и маршруты, которые будут доступны после входа в систему, потребуют этот токен.
Теперь у меня есть промежуточное ПО для проверки маршрутов, которые доступны только в том случае, если пользователь предоставляет токен, который генерируется во время входа в систему. Теперь, когда срок действия токена истекает, я пытаюсь заново сгенерировать токен с помощью старого токена, расшифровав его, и хочу передать его следующему контроллеру.
Сейчас он генерирует новый токен, но я не могу не передать его следующему контроллеру.
Как я могу отправить токен refre sh следующему контроллеру, и в ответе контроллера появится новый ключ с именем refreshToken, который будет содержать новый токен, и из моего внешнего интерфейса я снова сохраню это в локальном хранилище.
Аутентификация Middleware -
exports.validateToken = async (req, res, next) => {
var response_status = {};
var response_dataset = {};
var response_data = {};
let authorizationHeaader = req.headers['x-access-token'] || req.headers['authorization'];
if(authorizationHeaader){
if (authorizationHeaader.startsWith('Bearer ') || authorizationHeaader.startsWith('bearer ')) {
// Remove Bearer from string
var token = authorizationHeaader.slice(7, authorizationHeaader.length);
}
if (token) {
//Passing the token helpers for verification
global.Helpers.verifyToken(token)
.then(async jwtDecrept => {
req.body.user = jwtDecrept;
next();
}).catch(async err => {
if(err.name === 'TokenExpiredError') {
const payload = jwt.verify(token, process.env.JWT_SECRET, {ignoreExpiration: true});
let userDetails = {
id: payload.id,
email: payload.email,
name: payload.name,
role: payload.role
};
let Token = global.Helpers.createToken(userDetails);
token = Token;
console.log(token);
next();
}
else {
response_status.message = 'Authentication error. Token is not valid.';
response_data.dataset = response_dataset;
response_data.status = response_status;
res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
res.send({ response: response_data });
}
});
} else {
response_status.message = 'Authentication error. Token is required.';
response_data.dataset = response_dataset;
response_data.status = response_status;
res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
res.send({ response: response_data });
}
}else {
response_status.message = 'Authentication error. Token is required.';
response_data.dataset = response_dataset;
response_data.status = response_status;
res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
res.send({ response: response_data });
}
}
Следующая Middlewar -
exports.profile = async (req, res) => {
var response_status = {};
var response_dataset = {};
var response_data = {};
try {
console.log(req);
let user = await User.findById(req.body.user.id).select('-password');
response_status.message = "User Profile Fetched Successfully.";
response_data.dataset = user;
(response_data.status = response_status);
res.status(process.env.HTTP_RESPONSE_OK);
res.send({ response: response_data });
} catch (error) {
response_dataset = error;
response_status.message = error.message;
response_data.dataset = response_dataset;
(response_data.status = response_status);
res.status(process.env.HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
res.send({ response: response_data });
}
}
Маршруты -
const express = require('express');
const router = express.Router();
const authenticate = require('../middlewares/authenticate');
const User = require('../controllers/user');
router.post('/me', authenticate.validateToken, User.profile);
router.post('/allUsers', authenticate.validateToken, User.allUsers);
module.exports = router;