У меня странная проблема, или, может быть, я не понимаю, как работает JWT в контексте Express.JWT UnauthorizedError: не найдено авторизационного токена (запрос GET с файлом cookie)
var express = require('express')
var app = express();
var expressJWT = require('express-jwt');
var jwt = require('jsonwebtoken');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var unless = require('express-unless');
app.set('secret', 'some secret');
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use("/", expressJWT({secret:app.get('secret')})
.unless({
path:[
'/',
'/foo',
'/login'
]}
));
// my custom route middleware to verify a token
app.use(function(req, res, next) {
console.log("------------------------------------");
console.log("route middleware to verify a token");
console.log("");
// check header or url parameters or post parameters for token
var token = req.body.access_token || req.query.access_token || req.headers['x-access-token'] || req.cookies.access_token;
console.log("req.cookies.access_token:", req.cookies.access_token);
console.log("token:", token);
// decode token
if (token) {
// verifies secret and checks exp
jwt.verify(token, app.get('secret'), function(err, decoded) {
if (err) {
console.log("jwt.verify ERROR")
return res.json({ success: false, message: 'Failed to authenticate token.', err:err });
} else {
console.log("jwt.verify OK")
// if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});
app.get('/', function (req, res) {
res.send('Hello World!. /foo is open, /bar is protected. Login at /login')
})
app.get('/foo', function (req, res) {
res.send('Foo')
})
app.get('/bar', function (req, res) {
res.send('Foo')
})
app.get('/login', function (req, res) {
var username = 'mock_username';
var myToken = jwt.sign({username:username}, app.get('secret'));
res.cookie('access_token', myToken).send("logged in, check cookie");
})
app.listen(3000, function() {
console.log('Example app listening on port 3000!')
})
Я настраиваю токен JWT и сохраняю его в файле cookie в/логином. Это работает, и токен установлен, если я проверяю cookie в браузере (инструменты разработчика в Chrome).
я посещаю/или /Foo маршрут (незащищенный, как указано с), если, и браузер отображает правильный результат, но консоль по-прежнему бросает UnauthorizedError. Почему ошибка отображается в консоли, если я явно обозначил это как незащищенный маршрут с помощью «если»?
посещает /бар маршрут (защищенный), мой промежуточный слой не вызываются, я получаю UnauthorizedError как в консоли и в браузере. Как я могу убедиться, что промежуточное ПО запускается здесь, и как я могу предоставить доступ к этому маршруту, если токен действительно найден и проверен в моем промежуточном программном обеспечении?
потому что вы не прикрепляли 'если' с другим промежуточным программным обеспечением. –
Какие из них? Это ответ на первый вопрос из двух. Пожалуйста, поставьте его в форме ответа, чтобы я мог подняться и дать вам очки :) – Ska