如何仅使用node.js在api调用中禁用“withCredentials”(https包)

时间:2016-08-24 03:08:04

标签: javascript node.js xmlhttprequest cors

我正在使用一个加载内置https包的node.js脚本。使用它时我收到错误:

XMLHttpRequest cannot load [constructed-api-url]. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:3000' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.

我正在使用node.js 4.4.3,其https api docs并没有真正提及有关withCredentials的任何内容。

正在使用的脚本是this one

无论如何使用node.js https将xhr调用withCredentials设置为false?

我正在寻找类似于这个jquery ajax调用的东西(只关注xhr字段):

$.ajax({
            type: 'POST',  async:true,
            url: 'https://someapp.constructed.url/token',
            dataType: "json",
            contentType: 'application/x-www-form-urlencoded; charset=utf-8',
            xhrFields: {
                withCredentials: true
            },
            headers: {
                'Authorization': 'Basic ' + appInfo                    
            },              
            success: function (result) {
                var token = result.access_token;
                //…                   
            },
            error: function (req, status, error) {
                if (typeof(req) != 'undefined') {
                    var msg = status || req.responseJSON.error;
                    //…
                }                   
            }
    });

还有另一个非常相似的例子,但这与请求包有关,我不想将其包含在依赖项中。此外,我用过的脚本已经在使用https。

1 个答案:

答案 0 :(得分:0)

所以答案一直都在那里,毕竟:

经过一些研究,发现节点的https包使用与http几乎相同的选项,包括withCredentials选项(未在节点的http / https中记录,但是xhr文档的一部分)。这是在url选项中的选项对象中包含withCredentials选项,然后将options对象作为https.get的参数传递的问题。

构造的代码或多或少如下(关注options变量):

var options = {
  url: 'https://my.domain.com/api/endpoint',
  withCredentials: false  
}
var querystring = '?key=' + [_my_api_key];
var param1 = '&' + [paramKey] + '=' + [paramValue];

var datos;

options.url += querystring;
options.url += param1;

https.get(options, function (res) {
  res.on('data', function (data) {
    datos += data;
  });

  res.on('end', function () {      
    try {
      var data = JSON.parse(datos);
    } catch (e) {
      console.error('Unable to parse response as JSON', e);
    }
  });
}).on('error', function (e) {
    console.error('An error occurred with the request:', e.message);
    callback(e.message);
});