Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 刷新时的JWT角度身份验证_Javascript_Angularjs_Node.js_Mongodb_Express - Fatal编程技术网

Javascript 刷新时的JWT角度身份验证

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(

因此,我遵循以下Egghead.io指南:

有点奇怪,我正试图合并一个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;
};

有人能抓住我没看到的虫子吗?基本上,当我登录时,我在客户端上有一个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);