我在解码JSON Web令牌的所有请求上使用Express中间件,如果它成功,则将解码对象附加到req变量。我认为最好只发布我的代码,它会说明一切。基本上req.decoded不应该是未定义的'在我的' / user / me /'路由,因为我的中间件应该在成功登录后解码我的JSON Web令牌时设置该变量,但它似乎没有工作,我不知道为什么?
api.js
var mongoose = require('mongoose'),
userSchema = require('../models/User.js'),
User = mongoose.model('User', userSchema),
jwt = require('jsonwebtoken'),
config = require('../../config.js'),
localStorage = require('localstorage');
module.exports = function(app) {
//Check if user is logged in on every request.
app.use(function(req, res, next) {
var authToken = localStorage.getItem('token');
jwt.verify(authToken, config.hashKey, function(err, decoded) {
//decoded seems to be null even after login?
if (decoded) {
req.decoded = decoded;
}
});
next();
});
app.post('/login', function(req, res) {
User.findOne({ username: req.body.username, password: req.body.password }, function(err, user) {
if (err) handleError(err);
if (user) {
var authToken = jwt.sign({
username: user.username
}, config.hashKey, {
expiresInMinutes: 1440
});
localStorage.setItem('token', authToken);
res.send(user);
} else {
res.send('Invalid username or password');
}
});
});
app.get('/user/me/', function(req, res) {
//Outputs Undefined
console.log('req.decoded=' + req.decoded);
res.send(req.decoded);
});
app.post('/user/create', function(req,res) {
var newUser = new User({ username: req.body.username, password: hashedPassword });
newUser.save(function(err) {
if (!err) {
res.send('User created');
} else {
res.send(err);
};
});
});
};
server.js
var express = require('express'),
path = require('path'),
mongoose = require('mongoose'),
bodyParser = require('body-parser'),
require('./app/routes/api.js')(app);
mongoose.connect('localhost', 'triviaattack');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.listen(1337);
console.log('\033[2J');
console.log('Server started!');
答案 0 :(得分:0)
(免责声明:我对这些东西还是新手,但我的代码中有这个。)
这里有些不对劲。
首先,server / api中语句的排序非常重要。需要令牌的路由应位于验证令牌的app.use之后。不需要令牌的路由需要在app.use之前出现。这将包括您的登录路由,因为它根据定义没有令牌。
一旦你修改了订单,下一个问题(双关语)是你在app.use中调用next(),无论是否验证了令牌。只有在令牌得到验证时才需要调用next(),如果没有,则发送错误消息。结合修复您的订购,这将确保如果令牌无效,您的获取/发布需要令牌永远不会得到处理。