Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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 无法使用节点请求模块进行基本HTTP身份验证_Javascript_Node.js_Http_Mocha.js_Basic Authentication - Fatal编程技术网

Javascript 无法使用节点请求模块进行基本HTTP身份验证

Javascript 无法使用节点请求模块进行基本HTTP身份验证,javascript,node.js,http,mocha.js,basic-authentication,Javascript,Node.js,Http,Mocha.js,Basic Authentication,我正在用mocha测试我的应用程序,我想测试HTTP响应头代码,这取决于我用基本HTTP身份验证发送给它的凭据 在客户端,我对服务器进行了如下AJAX调用: $.ajax({ type: 'GET', url: url, beforeSend: function(xhr){ xhr.setRequestHeader("Authorization", "Basic " +btoa("username:password") ); }, s

我正在用mocha测试我的应用程序,我想测试HTTP响应头代码,这取决于我用基本HTTP身份验证发送给它的凭据

在客户端,我对服务器进行了如下AJAX调用:

  $.ajax({
    type: 'GET',
    url: url,
    beforeSend: function(xhr){
       xhr.setRequestHeader("Authorization", "Basic " +btoa("username:password") );
     },
     success:function(rsp){
          // do whatever I need;
     }
  });
而且它工作得很好。如果凭据有误,则网站将以302

在我的测试文件(mocha)中,我尝试发送相同的请求,但由于某些原因,它不起作用

以下是我尝试的不同方式:

it('should return 302 because wrong credentials', function(done){
 var auth = "Basic " +new Buffer("username:password").toString('base64');
  var options = {
      url: url,
      headers: {
      "Authorization": auth
      }
   };

   request.get(options, function(err, res, body){
      console.log(res.statusCode);
      assert.equal(302, res.statusCode);
     done();
   });
});

-----------------------

it('should return 302 because wrong credentials', function(done){
    request.get(url,
    {
      'auth': {
         'username':'username', 
         'password':'password'
       }
    }, 
    function(err, res, body) {
       assert.equal(302, res.statusCode);
       done();
    });
 });
但是,无论如何,我得到一个HTTP200响应代码

那为什么呢?我该怎么处理呢

Ps:对于那些非常谨慎的人来说,客户是不能公开使用的,因此我允许自己在其中加入凭证

编辑:更准确地说,您可以在下面找到处理请求的服务器代码(NodeJS)

function checkAuth(req, result, next){

  var header = req.headers['authorization'];

  // Ignore the preflight OPTION call
  if(header != undefined){
    var tmp = header.split(/\s+/).pop();
    var credentials = new Buffer(tmp, 'base64').toString();
    var parts = credentials.split(/:/);
    var username = parts[0];
    var password = parts[1];

    bcrypt.compare(username, config.get.username, function(err, res){
      if(res){
        bcrypt.compare(password, config.get.password, function(err, res){
          if(res){
            next();
          } else {
            return result.redirect('/');
          }
        });
      } else {
        return result.redirect('/');
      }
    });
  } else {
    return result.redirect('/');
  }

}

app.get('/server', checkAuth, getData.getMessages);
方法
getData.getMessage()
返回以下内容:

return result.status(200).json(res);

request
自动跟随重定向,因此您需要禁用
followRedirect
来读取
3xx
响应

var options = {
      url: url,
      followRedirect: false, 
      headers: {
      "Authorization": auth
      }
   };

对于HTTP基本身份验证,还可以使用模块


可能是服务器问题,请告诉我们您使用的是哪台HTTP服务器,如果可能的话,请告诉我们处理身份验证请求的代码。@MinusFour:当然,谢谢您的帮助:)这不是服务器错误:
请求被设计成最简单的HTTP调用方式。默认情况下,它支持HTTPS并遵循重定向。
这是我的想法。所以这200可以从你的
/
重定向中得到,请求将跟随它(通过对
/
执行一个新请求),并将得到一个正常的
200
响应代码。是的。嗯,差不多了。您应该更正您的答案,它不是
followRequest
,而是
followRedirect
。谢谢谢谢你的建议,伙计!
// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
    realm: "Simon Area.",
    file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});

// Creating new HTTP server.
http.createServer(basic, function(req, res) {
    res.end("Welcome to private area - " + req.user + "!");
}).listen(1337);