【发布时间】:2017-06-12 19:16:12
【问题描述】:
我有一个奇怪的问题,或者我不明白 JWT 在 Express 上下文中是如何工作的。
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 令牌并将其保存到 /login 路由中的 cookie。 如果我在浏览器中检查 cookie(Chrome 中的开发工具),这将起作用并且设置了令牌。
我访问了 / 或 /foo 路由(不受除非指定的保护),浏览器显示正确的结果,但控制台仍然抛出 UnauthorizedError。如果我用“除非”明确地将其标记为不受保护的路由,为什么控制台会显示错误?
我访问了 /bar 路由(受保护),我的中间件没有被调用,我在控制台和浏览器中都收到了 UnauthorizedError。如何确保在此处触发中间件,如果确实在我的中间件中找到并验证了令牌,我如何提供对该路由的访问权限?
【问题讨论】:
-
因为你还没有将
unless附加到其他中间件。 -
哪些,全部?这是两个问题中第一个问题的答案。请以答案的形式提出,以便我投票并给你积分:)
标签: node.js express cookies jwt