【发布时间】: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