401通过浏览器

时间:2016-07-15 17:33:43

标签: javascript node.js

我一直在尝试使用在浏览器中工作的URL来执行HTML GET请求,但在运行我的代码时会以某种方式导致401 Unauthorized错误。问题是我确实提供了身份验证; URL的格式为

http://username:password@url?param=value

它成功用于Firefox和Chrome(我也通过隐身模式以避免使用Cookie)以及Google的Postman应用程序,但是尽管尝试了其他几种HTTP GET请求方法,但它们都会返回未经授权的错误。我通过REST API和XMLHttpRequest以及命令行运行它。

关于可能导致这种情况的任何想法?或者,更好的是,如果有人有类似的问题并有解决方案吗?

(注意:我对这一切都很陌生,不确定我是否足够清楚/详细。如果有人需要,我会尽力详细说明。)

编辑:以下是我正在运行的原始代码的一些想法:

var func = function() {
  var options = {
    baseUrl: SERVER,
    uri: '/device.cgi',
    qs: {
      param1: value1,
      param2: value2
    }
  };
  request(options, function(err, response, body) {
    if (err) console.log(err);
    else console.log(body);
  });
};

我也跑了

function httpGet(theUrl)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
    xmlHttp.send( null );
    return xmlHttp.responseText;
}

来自this question并获得相同的未经授权的结果。

因为显然我正在使用的设备也适用于POST,

var func = function () {
  var formData = {
    form: {
      param1: value1,
      param2: value2
    }
  };
  request.post(SERVER + 'device.cgi', formData, function (err, response, body) {
    if (err) {
      console.log(err);
    }
    else console.log(body);
  }).auth(userID, userPass);
};

仍然有完全相同的结果。

1 个答案:

答案 0 :(得分:1)

  

http://username:password@url?param=value

浏览器正在获取该URL,并为您创建基本HTTP授权标头。

Node.js不会为您执行此操作,因此您必须在代码中自行设置Authorization标头。

var http = require('http');

var options = {
  host: 'www.tempuri.org',
  path: '/helloworld/',
  headers: {
    'Authorization': 'Basic QWxhZGRpbjpPcGVuU2VzYW1l'
  }
};

http.request(options, function(response) {
  var body = '';
  response.on('data',function(c) {
    body+= c;
  })
  response.on('end',function() {
    console.log(body)
  })
}).end();

以下链接讨论基本身份验证,浏览器如何对URL中的数据进行编码,以及如何在Node.js中自行实现它: