【问题标题】:REST adapter to work with https用于 https 的 REST 适配器
【发布时间】:2015-04-29 16:40:32
【问题描述】:

我正在用 Express 编写一个 REST 适配器,它将传入的 REST 调用转换为由北向设备公开的另一个 REST API。因此,本质上,客户端设备正在向适配器公开的 REST API 发送请求,而适配器向另一台设备发送 REST 请求。所以适配器既是客户端设备的 REST 服务器,也是北向设备的 REST 客户端。

var express = require('express');
var router = express.Router();
var request = require('request');

router.route('/')
    .get(function(req, res) {           
        request('URL'', function (error, response, body) {

            if (!error && response.statusCode == 200) {
                console.log("Sent to MOS");
                console.log(body) // Print the google web page.
            }
        })
    });

module.exports = router;

我正在使用请求模块。我的北向设备暴露了一个 https REST API。当我在上面代码的 URL 部分中插入 https(注意“s”)REST API 调用时,我没有从北向设备得到回复。

如果上面的“URL”指向一个 https 网站,例如https://www.httpsnow.org/,它会很好地工作。此外,当我在 POSTMAN 或同一设备上的浏览器中使用 https REST API 时,我会得到正确的响应。

所以我不明白为什么它可以通过 POSTMAN 工作,但不能通过我的代码工作。从兄弟那里,我必须先接受证书,所以我想问题是我的代码没有经过身份验证,但是如何构建该身份验证?

【问题讨论】:

    标签: javascript node.js express https


    【解决方案1】:

    这是一个微不足道的错误 - 您的服务器打开了与 HTTPS 服务器的连接,服务器的证书似乎无效,握手被拒绝并且您收到错误而不是响应。

    幸运的是,request 原生支持自定义 HTTPS 证书(即显示为无效的证书将显示为有效)。

    您可以为此使用agentOptions 选项。下载您必须使用浏览器接受的证书(他们应该在他们的文档中提供一个)并将其保存为 ca.cert.pem(或其他扩展名,取决于他们提供的内容)与您的 Node.js 应用程序相同的文件夹中重建。

    然后像这样使用它:

    var request = require('request');
    var fs = require('fs');
    
    request({
        url: 'https://api.some-server.com/',
        agentOptions: {
            ca: fs.readFileSync('ca.cert.pem') //Note: This will load the ca synchronously. Avoid doing this in production.
        }
    }, function(error, response, body){
      if(error){
        console.warn(error); //If an error occurred, you'll be informed
        return; //Won't run the rest of the function
      }
    
      if(response.statusCode === 200){
        //Do whatever you want
      }
    });
    

    【讨论】:

    • 我下载了证书并使用了您建议的代码,但出现错误:[错误:主机名/IP 与证书的替代名称不匹配]。我不得不将 rejectUnauthorized:false 添加到我认为是真正的安全漏洞的选项中。对我的目的无关紧要,因为这是用于内部公司应用程序,但很高兴了解如何正确处理此问题。
    【解决方案2】:

    这可能是北向 Web 服务器配置的问题,而不是请求库本身的问题。尝试将用户代理字符串更改为其他内容:

    var opts = {
      url: 'URI',
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
      }
    };
    
    request(opts, function (err, res, body) {
      // Do stuff
    });
    

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多