簡體   English   中英

如何使用 Node.JS 請求 HTTP Digest 身份驗證?

[英]How to do request HTTP Digest auth with Node.JS?

我必須用 Node.JS 編寫一些代碼來編寫 API 文檔,但是最近幾天我嘗試了所有可以在網絡上找到的解決方案(當然包括 Stack),但都沒有成功......

我的 API 使用 HTTP Digest Auth,這就是問題所在,我能夠連接,這沒什么大不了的,但每次我都得到相同的回報:

Got response : 401
HTTP Digest Authentication required for "api.example.com"

您可以在沒有身份驗證的情況下在下面顯示我的基本代碼! 因為我不知道在我所做的所有嘗試之后我能做什么:

var http = require('http')

var options = {
    host: 'api.example.com',
    path: '/example/1.xml',
};

var request = http.get(options, function(res){
    var body = "";
    res.on('data', function(data){
        body += data;
    })
    res.on('end', function(){
        console.log('Got response : ' + res.statusCode);
        console.log(body);
    })
    res.on('error', function(e){
        console.log('Got error : ' +e.message);
    });
});

我最后一次嘗試是使用這個模塊https://npmjs.org/package/request但他每次都無法工作 401 !

有關更多信息,我能夠使用 Ruby、Python、php 和 Java 從我的 API 中連接並獲取我需要的信息,因此我確信我的 API 運行良好並且我傳遞的信息是正確的。 我使用的是 Node v0.10.11 的最后一個穩定版本!

如果有人可以幫助我或有最新的解決方案,我會很高興。

編輯:我將使用模塊Mickael/request添加有關我的測試的一些詳細信息

第一次嘗試 :

var request = require('request')

var options = {
    'url': 'http://api.example.fr/example/1.xml',
    'auth': {
        'user': 'test',
        'pass': 'test',
        'sendImmediately': false
    }
};

var request = request.get(options, function(error, response, body){
    if (!error && response.statusCode == 200){
        console.log('body : ' + body)
    }
    else{
        console.log('Code : ' + response.statusCode)
        console.log('error : ' + error)
        console.log('body : ' + body)
    }
});

第二次嘗試:

var request = require('request')

request.get('http://api.example.fr/example/1.xml', function(error, response, body){
    if (!error && response.statusCode == 200){
        console.log('body : ' + body)
    }
    else{
        console.log('Code : ' + response.statusCode)
        console.log('error : ' + error)
        console.log('body : ' + body)
    }
}).auth('test', 'test', false);

但返回還是一樣的 401

這是您的示例,已更正為根據其 API 使用request

var options = {
  uri: 'http://api.example.fr/example/1.xml',
  auth: {
    user: 'test',
    pass: 'test',
    sendImmediately: false
  }
};
request(options, function(error, response, body){
    if (!error && response.statusCode == 200){
        console.log('body : ' + body)
    }
    else{
        console.log('Code : ' + response.statusCode)
        console.log('error : ' + error)
        console.log('body : ' + body)
    }
});

請求鏈式 API 有點令人困惑(恕我直言),但我相信您也可以讓它以這種方式工作。

請求包中的摘要身份驗證似乎不完整。

你可以試試: https : //npmjs.org/package/http-digest-client ,它是一個相當不錯的用於摘要認證的輕量級實現。

如果您需要使用要發送的正文消息執行摘要身份驗證 POST,您可以將請求與 http-digest-client 結合使用。 安裝后,只需打開 node-modules 下的 http-digest-client 代碼,並將其對 http 包的使用替換為請求包 api。

嘗試使用urllib它將使用簡單且令人厭惡的身份驗證。

const httpClient = require('urllib');
const url = 'https://site.domain.com/xmlapi/xmlapi';
const options = {
  method: 'POST',
  rejectUnauthorized: false,
  // auth: "username:password" use it if you want simple auth
  digestAuth: "username:password",
  content: "Hello world. Data can be json or xml.",
  headers: {
     //'Content-Type': 'application/xml'  use it if payload is xml
     //'Content-Type': 'application/json' use it if payload is json 
    'Content-Type': 'application/text'
  }
};
const responseHandler = (err, data, res) => {
  if (err) {
    console.log(err);
  }
  console.log(res.statusCode);
  console.log(res.headers);
  console.log(data.toString('utf8'));
}
httpClient.request(url, options, responseHandler);

你的樣品是工作

var request = require('request')

request.get('http://api.example.fr/example/1.xml', function(error, response, body){
    if (!error && response.statusCode == 200){
        console.log('body : ' + body)
   }
    else{
       console.log('Code : ' + response.statusCode)
       console.log('error : ' + error)
       console.log('body : ' + body)
   }
}).auth('test', 'test', false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM