NodeJS Express Router,在中间件和路由之间传递解码对象?

时间:2015-08-22 12:47:36

标签: javascript json node.js authentication express

我在解码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!');

1 个答案:

答案 0 :(得分:0)

(免责声明:我对这些东西还是新手,但我的代码中有这个。)

这里有些不对劲。

首先,server / api中语句的排序非常重要。需要令牌的路由应位于验证令牌的app.use之后。不需要令牌的路由需要在app.use之前出现。这将包括您的登录路由,因为它根据定义没有令牌。

一旦你修改了订单,下一个问题(双关语)是你在app.use中调用next(),无论是否验证了令牌。只有在令牌得到验证时才需要调用next(),如果没有,则发送错误消息。结合修复您的订购,这将确保如果令牌无效,您的获取/发布需要令牌永远不会得到处理。