Я создал проект Node с passport. Когда я не указывал токен в качестве заголовка, он возвращает Unauthorized. Как я могу изменить это сообщение на красивое как Sorry invalid credentials
Каждый раз, когда токен не может быть выдан, я получал ответ как Несанкционированный. Я хочу изменить это на красивое сообщение.
Passport.js
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const mongoose = require('mongoose');
var User = require('../models/user'); // get the mongoose model
const keys = require('../config/keys');
const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrKey;
module.exports = passport => {
passport.use(
new JwtStrategy(opts, (jwt_payload, done) => {
User.findById(jwt_payload.id)
.then(user => {
if (user) {
return done(null, user);
}
return done(null, false);
})
.catch(err => console.info(err))
})
);
};
пользователь route.js
const express = require('express');
const router = express.Router();
const jwt = require('jsonwebtoken');
const passport = require('passport');
const setting=require("../validation/settings");
const User = require('../models/user');
// *** GET *** /api/users/all *** Retrieve all users' basic details ***
router.get("/", passport.authenticate('jwt', {session: false}), function (req, res)
{
var token = getToken(req.headers);
console.info('the token: ' + token);
User.find()
.select('fname lname email avatar contact_no role')
.where('is_deleted').equals('false')
.exec()
.then(docs => {
return res.send(setting.status("User details retrieval successfully",false, "User details retrieval successfully", docs))
//res.status(200).json(setting.status(validation.SHOW,true,"User details retrieval successfully.",docs))
.catch(err => {
return res.send(setting.status("Error in retrieving user details",false, "Error may token", err))
});
});
});
getToken = function (headers) {
if (headers && headers.authorization) {
var parted = headers.authorization.split(' ');
if (parted.length === 2) {
return parted[1];
} else {
return null;
}
} else {
return null;
}
};
module.exports = router;
Как я могу изменить сообщение unauthorized на красивое («Вы не можете получить подробности»,)?
Я пробовал, но не получилось. Думаю не попадает в мой паспорт .js





Согласно официальной документации Passport, вы можете использовать функцию индивидуальный обратный вызов для обработки случая неудачной авторизации и переопределения сообщения по умолчанию.
Если вы разрабатываете REST API и хотите отправить красивый ответ JSON, как показано ниже:
{
"error": {
"name": "JsonWebTokenError",
"message": "invalid signature"
},
"message": "You cannot get the details. You are not authorized to access this protected resource",
"statusCode": 401,
"data": [],
"success": false
}
Я использовал аутентификацию Passport JWT для защиты некоторых из моих маршрутов и применил authMiddleware, как показано ниже:
приложение / промежуточное ПО / authMiddleware.js
const express = require('express');
const router = express.Router();
const passport = require('passport');
const _ = require('lodash');
router.all('*', function (req, res, next) {
passport.authenticate('jwt', { session: false }, function(err, user, info) {
// If authentication failed, `user` will be set to false. If an exception occurred, `err` will be set.
if (err || !user || _.isEmpty(user)) {
// PASS THE ERROR OBJECT TO THE NEXT ROUTE i.e THE APP'S COMMON ERROR HANDLING MIDDLEWARE
return next(info);
} else {
return next();
}
})(req, res, next);
});
module.exports = router;
приложение / маршруты / approutes.js
const authMiddleware = require('../middlewares/authMiddleware');
module.exports = function (app) {
// secure the route by applying authentication middleware
app.use('/users', authMiddleware);
.....
...
..
// ERROR-HANDLING MIDDLEWARE FOR SENDING ERROR RESPONSES TO MAINTAIN A CONSISTENT FORMAT
app.use((err, req, res, next) => {
let responseStatusCode = 500;
let responseObj = {
success: false,
data: [],
error: err,
message: 'There was some internal server error',
};
// IF THERE WAS SOME ERROR THROWN BY PREVIOUS REQUEST
if (!_.isNil(err)) {
// IF THE ERROR IS REALTED TO JWT AUTHENTICATE, SET STATUS CODE TO 401 AND SET A CUSTOM MESSAGE FOR UNAUTHORIZED
if (err.name === 'JsonWebTokenError') {
responseStatusCode = 401;
responseObj.message = 'You cannot get the details. You are not authorized to access this protected resource';
}
}
if (!res.headersSent) {
res.status(responseStatusCode).json(responseObj);
}
});
};
Проверьте паспорт в документация. Вы можете реализовать это с помощью флеш-сообщений. Мне нужно использовать дополнительные пакеты, такие как connect-flash