У меня есть приложение, использующее стандартную аутентификацию jwt, показанную ниже и скопированную из readme-файла express-jwt.
app.use(jwt({
secret: 'hello world !',
credentialsRequired: false,
getToken: function fromHeaderOrQuerystring (req) {
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
return req.headers.authorization.split(' ')[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
}));
Когда я нажимаю api, заголовок авторизации равен «Bearer hello world!». Это соответствует моему секрету, но я получаю несанкционированное сообщение 401. Кто-нибудь знает, почему? Разве req.headers.authorization.split ('') [1] не должно соответствовать секрету?





Нет, предъявитель - это не ваш секрет. Это jwt в кодировке base64, содержащий (заголовок, полезную нагрузку и подпись). Секрет используется для подписи полезной нагрузки jwt с помощью алгоритма, указанного в заголовке jwt.
Прочтите введение к официальный сайт JWT, чтобы понять эту концепцию.
Вы можете использовать пакет npm JsonWebtoken для реализации аутентификации на основе jwt в своем экспресс-приложении. Вот как работает аутентификация:
импортировать jwt из пакета
const jwt = require ('jsonwebtoken');
Установите токен в файле login.service.js или там, где это требуется, с соответствующими данными в качестве полезной нагрузки:
const token = jwt.sign('payload', 'secret key',
{ expiresIn: 60*60 });
how token looks: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYW5pcyIsImVtYWlsIjoic29tZW1lYWlsLmNvbSIsImlhdCI6MTUxNjIzOTAyMn0.FyDrUNkvDi82lYv8JioAB9Ih8vyn6Y6mY8PpUiIz8nY
Расшифровать его можно, вставив токен на сайт jwt.io.
Обычно мы храним токен в файлах cookie (перед отправкой ответа в файле login.router.js установите cookie как токен):
router.get('/auth/google/callback', (req, res, next) => {
loginCtrl.redirectGoogle(req, res, next).then((result) => {
res.cookie('userToken', token);
res.redirect('/#/app/home');
}, (err) => {
console.info("Error in authentication **[ ", err, " ]** ");
res.redirect(500, '/#/login');
});
теперь напишите промежуточное ПО (аутентификацию), которое вызывается перед каждым запросом API (файл authentication.router.js).
router.use((req, res, next) => {
try {
const token = req.cookies.currentUser;
// console.info('cookie', token);
// to decode token
if (token) {
authCtrl.verifyToken(token, (err, decoded) => {
if (err) {
res.clearCookie(config.UserToken);
res.status(401).json({ error: ' Session Timeout... Please login again' });
// console.info('token expired');
// res.redirect('/#/login');
} else {
req.user = decoded;
next();
}
// console.info('Token verified');
// res.cookie(config.cookie.name,successResult.authToken);
});
} else {
// if there is no token
// return an error
return res.status(403).send({
message: 'User not authenticated.',
});
}
} catch (error) {
// console.info(error);
return error;
}
});const jwt = require('jsonwebtoken');
const verifyToken = (usertoken, done) => {
jwt.verify(usertoken,'secret key', (err, res) => {
if (err) {
return done(err);
}
return done(null, res);
});
};
module.exports = {
verifyToken,
};Теперь ваши конечные точки API защищены аутентификацией. Убедитесь, что промежуточное ПО для аутентификации находится наверху в файле app.js.
router.use('/login', require('./modules/login'));
router.use('/logout', (req, res) => {
res.clearCookie(userToken);
res.redirect('/');
});
router.use(require('./modules/authentication'));
// Each Module to be placed after this
router.use('/communityMembers',require('./modules/communitymember'));