0
所以我遵循以下Egghead.io指南: https://egghead.io/lessons/angularjs-finalizing-jwt-authentication-with-angularjsJWT角认证上的刷新
与一捻,我试图将一个MongoDB的检索我的用户。到目前为止,我的所有工作都已完成,除了最后一部分,他声明/ me路由应该返回req.user并且刷新时应该没问题。我不明白。我得到的是从我的服务器返回的空白用户。
我的服务器代码的设置是这样的:
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;
};
谁能赶上我没有看到的bug这里?基本上,当我登录时,客户端上有一个JWT,但我在客户端控制器上的初始化没有意识到我已登录(它不会将用户对象设置为任何内容)。这有点奇怪。
'req.user'的值由express-jwt设置。它是解码的标记。您的验证方法不应该设置用户,如果用户验证正确,它只会调用下一个中间件。然后,下一个中间件将返回该令牌,该令牌将由express-jwt在将来的请求中解码为req.user对象。如果由于某种原因需要查找使用情况,可以使用req.user中的信息来查找使用情况并将其设置为req.resolvedUser(或任何您喜欢的)。祝你好运! – kentcdodds 2014-12-07 19:55:06
你是上帝,谢谢你的帮助! Egghead应该为你付出更多! – noname 2014-12-11 03:05:44