Javascript 刷新时的JWT角度身份验证
因此,我遵循以下Egghead.io指南: 有点奇怪,我正试图合并一个MongoDB来检索我的用户。到目前为止,我已经完成了所有工作,除了最后一部分,他指出/me路由应该只返回req.user,刷新时应该可以。我不明白。我得到的是从我的服务器返回的空白用户 我的服务器代码设置如下:Javascript 刷新时的JWT角度身份验证,javascript,angularjs,node.js,mongodb,express,Javascript,Angularjs,Node.js,Mongodb,Express,因此,我遵循以下Egghead.io指南: 有点奇怪,我正试图合并一个MongoDB来检索我的用户。到目前为止,我已经完成了所有工作,除了最后一部分,他指出/me路由应该只返回req.user,刷新时应该可以。我不明白。我得到的是从我的服务器返回的空白用户 我的服务器代码设置如下: var jwtSecret = 'fjkdlsajfoew239053/3uk'; app.use(cors()); app.use(bodyParser.json()); app.use(expressJwt(
var jwtSecret = 'fjkdlsajfoew239053/3uk';
app.use(cors());
app.use(bodyParser.json());
app.use(expressJwt({ secret: jwtSecret }).unless({ path: [ '/login' ]}));
app.use(compression());
app.use(express.static(__dirname + '/client'));
app.get('/', function(req, res){
res.render(__dirname + '/client/bundle.js');
});
app.get('/me', function (req, res) {
res.send(req.user);
});
... setup for user schema and other boring stuff ...
function authenticate(req, res, next) {
var body = req.body;
if (!body.username || !body.password) {
res.status(400).end('Must provide username or password');
}
//do salting, hashing, etc here yo
User.findOne({ username: body.username }, function(err, user){
if (user === null || body.password !== user.password) {
res.status(401).end('Username or password incorrect');
}else{
req.user = user;
next();
}
});
}
// ROUTES
app.post('/login', authenticate, function (req, res, next) {
var token = jwt.sign({
username: req.user.username
}, jwtSecret);
res.send({
token: token,
user: req.user
});
});
app.listen(process.env.PORT || 5000);
处理基本身份验证的控制器(客户端)是:
module.exports = function($scope, $state, $modal, UserFactory) {
var vm = this;
$scope.$state = $state;
$scope.sign_in = false;
$scope.open = function () {
var $modalInstance = $modal.open({
templateUrl: 'suggestion-modal.html',
controller: 'modalCtrl'
});
};
// initialization
UserFactory.getUser().then(function success(response) {
vm.user = response.data;
});
function login(username, password) {
UserFactory.login(username, password).then(function success(response) {
vm.user = response.data.user;
}, handleError);
}
function logout() {
UserFactory.logout();
vm.user = null;
}
function handleError(response) {
alert('Error: ' + response.data);
}
vm.login = login;
vm.logout = logout;
};
有人能抓住我没看到的虫子吗?基本上,当我登录时,我在客户端上有一个JWT,但是我在客户端控制器上的初始化没有识别到我已登录(它没有将用户对象设置为任何东西)。这有点奇怪。所以我的解决方案最终考虑了肯特的帮助和一点头脑风暴。看起来是这样的。请注意,显然express中的中间件排序非常重要,因为在加载express jwt时进行更改后,客户端在初始目录加载时是否检查了身份验证头会产生巨大的差异(如果它们是角形的,则不会加载,整个应用程序也会崩溃)。干杯
express jwt设置
req.user
的值。这是已解码的令牌。您的身份验证方法不应该设置用户,如果用户正确身份验证,它只调用下一个中间件。然后,下一个中间件返回令牌,在将来的请求中,express jwt将其解码到req.user对象中。如果出于某种原因需要查找用法,可以使用req.user中的信息查找用法并将其设置为req.resolvedUser(或任何您喜欢的)。祝你好运你是上帝,谢谢你的帮助!书呆子应该付给你更多!
'use strict';
var faker = require('faker');
var cors = require('cors');
var bodyParser = require('body-parser');
var jwt = require('jsonwebtoken');
var expressJwt = require('express-jwt');
var compression = require('compression');
var express = require('express');
var bcrypt = require('bcrypt');
var connectLiveReload = require('connect-livereload');
var jwt = require('jsonwebtoken');
var app = express();
var jwtSecret = 'fjkdlsajfoew239053/3uk';
app.use(cors());
app.use(bodyParser.json());
app.use(compression());
app.use(express.static(__dirname + '/client'));
// app.get('/', function(req, res){
// res.render(__dirname + '/client/bundle.js');
// });
app.use(expressJwt({ secret: jwtSecret }).unless({ path: ['/login']}));
app.get('/me', function (req, res) {
res.send(req.user);
});
...schema stuff...
// UTIL FUNCTIONS
function authenticate(req, res, next) {
var body = req.body;
if (!body.username || !body.password) {
res.status(400).end('Must provide username or password');
}
//do salting, hashing, etc here yo
User.findOne({ username: body.username }, function(err, user){
if (user === null || body.password !== user.password) {
res.status(401).end('Username or password incorrect');
}else{
req.user = user;
next();
}
});
}
// ROUTES
app.post('/login', authenticate, function (req, res, next) {
var token = jwt.sign({
username: req.body.username
}, jwtSecret);
res.send({
token: token,
user: req.user
});
});
// app.use(connectLiveReload()); figure out whats wrong with this later and get livereload working
app.listen(process.env.PORT || 5000);