【问题标题】:https request basic authentication node.jshttps 请求基本认证 node.js
【发布时间】:2014-10-23 18:35:46
【问题描述】:

通过网络和 stackoverflow 寻找这个我真的很疯狂。 关于这个主题的其他帖子谈论的是http请求,而不是httpS。

我正在使用 node.js 编写服务器端代码,我需要向另一个网站发出 https 请求才能登录

如果我在 chrome 中使用邮递员工具尝试使用 https://user:pass@webstudenti.unica.it/esse3/auth/Logon.do 一切正常并且我登录。

如果我在节点中使用请求库,我将无法登录,并且我会得到一个页面,其中包含有关我获取/发送数据时出错的自定义错误消息。

也许我错误地设置了传递给请求的选项。

var request = require('request');
var cheerio = require('cheerio');
var user =  'xxx';
var pass = 'yyy';
var options = {
    url : 'https://webstudenti.unica.it',
    path : '/esse3/auth/Logon.do',
    method : 'GET',
    port: 443,
    authorization : {
        username: user,
        password: pass
    }
}

request( options, function(err, res, html){
    if(err){
        console.log(err)
        return
    }
    console.log(html)
    var $ = cheerio.load(html)
    var c = $('head title').text();
    console.log(c);
})

http://jsfiddle.net/985bs0sc/1/

【问题讨论】:

  • 已解决。与 Request 和 Request-Debug 包的作者 Mikeal 和 Nylen 交谈后,发现 options 对象中缺少两个参数:Jar: request.jar() to handle cookie 因为服务器正在等待一个 JSESSIONID 和“用户代理”标头
  • 您好,我也遇到了同样的问题,您能详细说明您是如何解决这个问题的吗?
  • 嗨@ChrisTopher。我正在编写后端代码,后端由一个刮板组成。在 Node.Js 中编码的 Scraper 向需要基本身份验证的服务器发出 http 请求。为了从服务器获取正确的 DOM,我写了这个:

标签: javascript node.js authentication https


【解决方案1】:

http/https 应该对身份验证没有影响。您的用户/通行证很可能需要进行 base64 编码。试试

var user =  new Buffer('xxx').toString('base64');
var pass = new Buffer('yyy').toString('base64');

见:https://security.stackexchange.com/questions/29916/why-does-http-basic-authentication-encode-the-username-and-password-with-base64

【讨论】:

  • headers: { 'Authorization': 'Basic' + new Buffer(user + ':' + pass).toString('base64') }
【解决方案2】:

您的http auth options 设置不正确(即authorization 应改为auth)。它应该看起来像:

var options = {
    url: 'https://webstudenti.unica.it',
    path: '/esse3/auth/Logon.do',
    method: 'GET',
    port: 443,
    auth: {
        user: user,
        pass: pass
    }
}

【讨论】:

【解决方案3】:

使用更新版本,我可以使用基本身份验证进行 https 调用。

var request = require('request');
    request.get('https://localhost:15672/api/vhosts', {
        'auth': {
            'user': 'guest',
            'pass': 'guest',
            'sendImmediately': false
        }
     },function(error, response, body){
    if(error){
        console.log(error)
        console.log("failed to get vhosts");
        res.status(500).send('health check failed');
    }
    else{
            res.status(200).send('rabbit mq is running');   
    }

 })

【讨论】:

    【解决方案4】:

    不要使用 npm 包 request,因为它已被弃用,请改用 Node native https

    const https = require('https')
    
    var options = {
       host: 'test.example.com',
       port: 443,
       path: '/api/service/'+servicename,
       // authentication headers
       headers: {
          'Authorization': 'Basic ' + new Buffer(username + ':' + passw).toString('base64')
       }   
    };
    
    //this is the call
    request = https.get(options, function(res){
      console.log(`statusCode: ${res.statusCode}`)
    
      res.on('data', d => {
        process.stdout.write(d)
      })
    })
    
    req.on('error', error => {
      console.error(error)
    })
    
    req.end()
    

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2011-03-06
      • 2011-12-26
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2016-09-08
      相关资源
      最近更新 更多