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

Posted

技术标签:

【中文标题】如何仅使用 node.js(https 包)在 api 调用中禁用“withCredentials”【英文标题】:How to disable 'withCredentials' in api call using node.js only (https package) 【发布时间】:2016-12-31 00:37:20 【问题描述】:

我正在使用加载内置 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。

【问题讨论】:

这是浏览器错误,与节点无关。 @AlexeyTen:当然不是节点的错,但是从 jquery ajax 示例中可以看出,可以从请求代码中设置特定的 xhr 标志。这可以从 node.js 的 https 模块完成吗? 节点不关心这个标志。您应该在浏览器中执行的 JS 代码中查找它。 【参考方案1】:

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

经过一番研究,发现 node 的 https 包使用与 http 几乎相同的选项,包括 withCredentials 选项(在 node 的 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);
);

【讨论】:

以上是关于如何仅使用 node.js(https 包)在 api 调用中禁用“withCredentials”的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 6.6 安装 Node.js

如何在 Node.js 中使用 HTTPS

[转] 使用NVM快速搭建NODE开发环境

如何使用 node.js 和 Request 包禁用 HTTP 标头中的“withcredentials”?

如何统一前端项目的 Node 版本和包管理器?

如何运行nodejs环境