Javascript Js没有将授权标头发送到服务器

Javascript Js没有将授权标头发送到服务器,javascript,angularjs,node.js,satellizer,Javascript,Angularjs,Node.js,Satellizer,问题:卫星导航器未将授权标头发送到服务器 我正在一个项目中试用Satellizer.Js。不过,到目前为止还不错,它没有正确地将请求中的授权头发送到服务器(注意:我使用Node作为后端)。这不是CORS的问题,因为我目前正在使用localhost。当我在本地登录/注册时,服务器会用令牌响应,Satellizer会在本地存储中正确设置令牌。我检查了dev工具中的Network选项卡来检查头,但是没有授权头。有没有人处理过这个问题,或者有什么想法/技巧我可以使用?提前谢谢 以下是我的server.j

问题:卫星导航器未将授权标头发送到服务器

我正在一个项目中试用Satellizer.Js。不过,到目前为止还不错,它没有正确地将请求中的授权头发送到服务器(注意:我使用Node作为后端)。这不是CORS的问题,因为我目前正在使用localhost。当我在本地登录/注册时,服务器会用令牌响应,Satellizer会在本地存储中正确设置令牌。我检查了dev工具中的Network选项卡来检查头,但是没有授权头。有没有人处理过这个问题,或者有什么想法/技巧我可以使用?提前谢谢

以下是我的server.js代码:

var express = require('express'),
app = express(),
path = require('path'),
cors = require('cors'),
bodyParser = require('body-parser'),
mongoose = require('mongoose'),
config = require('./config/config'),
morgan = require('morgan'),
port = process.env.PORT || 8080;


var express = require('express'),
app = express(),
path = require('path'),
cors = require('cors'),
bodyParser = require('body-parser'),
mongoose = require('mongoose'),
config = require('./config/config'),
morgan = require('morgan'),
port = process.env.PORT || 8080;


//connect to the database
mongoose.connect(config.db);
//morgan - log all requests to the console
app.use(morgan('dev'));

//middleware for body parser
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

//handle CORS requests
app.use(cors());
/*app.use(function(req,res,next){
   res.setHeader('Access-Control-Allow-Origin', '*');
   res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
   res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, content-type, \ Authorization');  
   next();
});*/

//set the location for static files
app.use(express.static(__dirname + '/public'));

//API Routes
var apiRoutes = require('./app/routes/app-routes.js')(app,express);

app.use('/auth', apiRoutes);

//send the users to the front end
app.get('*', function(req,res){
   res.sendFile(path.join(__dirname + '/public/app/views/index.html')); 
});


//listen on port
app.listen(port, function(){
   console.log('Listening on port: ' + port + "...."); 
});
以下是使用卫星导航器在角度一侧设置标记的位置:

vm.login = function(){
        $auth.login({email: vm.user.email, password: vm.user.password})
            .then(function(res){                    
                //check for token;
                if(!res.data.token){
                    vm.error = true;
                    vm.errorMessage = res.data.message;
                }else{
                    //redirect to the dashboard

                    $location.path('/dashboard');
                }    
            })
            .catch(function(){
                vm.error = true;
                vm.errorMessage = "Failed to login, please try again."
            });
    };
这是我唯一经过身份验证的路由:

router.get('/dashboard', ensureAuthenticated, function(req,res){
    //with a validated token
    console.log(req.headers);
    console.log(req.headers.authorization);
    res.json({success: true, message:'You made it, congrats!'});
});
这是我的create-a-token函数,这是我的身份验证中间件:

function createToken(user){
    var payload = {
        exp: moment().add(14, 'days').unix,  
        iat: moment().unix(),
        sub: user._id
    }
    return jwt.encode(payload,config.secret);
};

function ensureAuthenticated(req, res, next) {
          if (!req.headers.authorization) {
            return res.status(401).send({ message: 'Please make sure your request has an Authorization header' });
          }
          var token = req.headers.authorization.split(' ')[1];

          var payload = null;
          try {
            payload = jwt.decode(token, config.secret);
          }
          catch (err) {
            return res.status(401).send({ message: err.message });
          }

          if (payload.exp <= moment().unix()) {
            return res.status(401).send({ message: 'Token has expired' });
          }
          req.user = payload.sub;
          next();
    }

尝试如下设置授权标头

request.headers.Authorization = token;

使用
$auth.setToken
手动设置
token
的动机是什么?当使用
$auth.login
时,
卫星导航器会自动进行设置

以下是
Satellizer
登录示例,它在我们的应用程序中非常有效:

angular.module('MyApp')
  .controller('LoginCtrl', function($scope, $location, $auth, toastr) {
    $scope.login = function() {
      $auth.login($scope.user)
        .then(function() {
          toastr.success('You have successfully signed in!');
          $location.path('/');
        })
        .catch(function(error) {
          toastr.error(error);
        });
    };
  });

一句话:你不应该自己设置
token
<代码>卫星导航器
在幕后自动执行。

我也遇到了同样的问题。您必须发送前缀为“/api/”的所有请求。没有这个前缀,我得到了错误,但是w

将Angular和Node.js代码与CORS配置一起发布。卫星导航器不太可能损坏。@kyrylkov添加了我的代码:)所以当Angular code和Node.js应用程序在localhost上的何处时,它都能工作?远程部署时,您的Angular应用程序是否托管在与Node.js服务器不同的域中?@kyrylkov否,它是同一个域。我还没有远程部署它;仍然在本地主机上。如果它是同一个域,它与CORS无关。不幸的是,显式设置头不起作用。卫星应该自己做这件事。你试过我的建议吗?我只希望这是答案。调试时,我在那里设置了令牌:/@问题在你这边。克隆并运行
Satellizer
example目录,看看它是否能像那样工作。是的,问题肯定在我这边。克隆和运行回购协议非常有效。至少我知道这不是卫星的错误。
angular.module('MyApp')
  .controller('LoginCtrl', function($scope, $location, $auth, toastr) {
    $scope.login = function() {
      $auth.login($scope.user)
        .then(function() {
          toastr.success('You have successfully signed in!');
          $location.path('/');
        })
        .catch(function(error) {
          toastr.error(error);
        });
    };
  });