【问题标题】:NodeJS Express Router, pass decoded object between middleware and route?NodeJS Express路由器,在中间件和路由之间传递解码的对象?
【发布时间】:2015-11-16 08:12:13
【问题描述】:

我在所有请求上使用 Express 中间件来解码 JSON Web 令牌,如果成功,则将解码的对象附加到 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!');

【问题讨论】:

  • 您不能使用localstorage 获取令牌。这是一个服务器端存储模块。如果您想接收令牌,您必须将令牌从客户端发送到服务器。
  • 谢谢 gabe,我会检查指南。我以为本地存储是客户端?像饼干一样?
  • 这个localstorage和浏览器中的localstorage是完全不同的。他们无法相互“交流”。
  • 有没有可以和你知道的浏览器localstorage交互的npm模块?我想我必须将令牌附加到请求标头?无论如何,再次感谢,即将检查指南。希望这是我正在寻找的。​​span>

标签: javascript json node.js authentication express


【解决方案1】:

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

这里有几处问题。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-20
    • 2023-03-09
    • 2016-04-20
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多