基本認証がある場合にNode.jsでhttp.clientを使用する方法


105

タイトルどおり、どうすればよいですか?

これが私のコードです:

var http = require('http');

// to access this url I need to put basic auth.
var client = http.createClient(80, 'www.example.com');

var request = client.request('GET', '/', {
    'host': 'www.example.com'
});
request.end();
request.on('response', function (response) {
  console.log('STATUS: ' + response.statusCode);
  console.log('HEADERS: ' + JSON.stringify(response.headers));
  response.setEncoding('utf8');
  response.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

12
http.createClientは非推奨です。代わりに「http.request」を使用してください。
トーマスピーター2012

回答:


271

Authorizationヘッダーにフィールドを設定する必要があります。

Basicこの場合の認証タイプと、username:passwordBase64でエンコードされる組み合わせが含まれています。

var username = 'Test';
var password = '123';
var auth = 'Basic ' + Buffer.from(username + ':' + password).toString('base64');
// new Buffer() is deprecated from v6

// auth is: 'Basic VGVzdDoxMjM='

var header = {'Host': 'www.example.com', 'Authorization': auth};
var request = client.request('GET', '/', header);

4
それだけで全体が機能します。サーバーは、データがBase64でエンコードされることを想定しています。
Ivo Wetzel

3
この例の「クライアント」とは何ですか?
Steven Soroka

1
ああ、それは問題です。ああ。nm。
Steven Soroka

すごい、本当に助かりました!
Chris Allinson、

61

以下からのNode.js http.request APIドキュメント あなたはに似たものを使用することができます

var http = require('http');

var request = http.request({'hostname': 'www.example.com',
                            'auth': 'user:password'
                           }, 
                           function (response) {
                             console.log('STATUS: ' + response.statusCode);
                             console.log('HEADERS: ' + JSON.stringify(response.headers));
                             response.setEncoding('utf8');
                             response.on('data', function (chunk) {
                               console.log('BODY: ' + chunk);
                             });
                           });
request.end();

8
これが現代の答えです。
David Jones

2
「user:password」または「Basic user:password」を実行する必要がありますか?
ケイティ

2
@kayvarいいえ、Basicを前に付ける必要はありません。
Sujay 2015年

@MarceloFilhoこれは、ドキュメントに表示されるものですauth <string>基本認証、つまり承認ヘッダーを計算するための「user:password」。
Sujay 2018

15
var username = "Ali";
var password = "123";
var auth = "Basic " + new Buffer(username + ":" + password).toString("base64");
var request = require('request');
var url = "http://localhost:5647/contact/session/";

request.get( {
    url : url,
    headers : {
        "Authorization" : auth
    }
  }, function(error, response, body) {
      console.log('body : ', body);
  } );

1
セキュリティおよびユーザビリティの問題のため、Buffer()は推奨されません。代わりに、Buffer.alloc()、Buffer.allocUnsafe()、またはBuffer.from()メソッドを使用してください
Sourabh

13

より簡単な解決策は、URLで直接user:pass @ host形式を使用することです。

リクエストを使用するライブラリの:

var request = require('request'),
    username = "john",
    password = "1234",
    url = "http://" + username + ":" + password + "@www.example.com";

request(
    {
        url : url
    },
    function (error, response, body) {
        // Do more stuff with 'body' here
    }
);

これについても、小さなブログ記事を書きました。


18
これは理想的なアドバイスではありません。クライアント側またはサーバー側のいずれかでURLのログを記録すると、パスワード値が公開される可能性があります。これは、広く知られているセキュリティ攻撃ベクトルです。誰もこれをしないことを強くお勧めします。ヘッダー値の方が優れており、基本認証を使用していない-ダイジェスト認証またはOAuth 1.0a(たとえば)の方が適しています。この形式の識別は、RFC 3986のURIでも推奨されていません。–
Les Hazlewood

基本認証を使用しないことは、悪いアドバイスのように思えます。基本認証はトランスポートセキュリティを必要とするか、完全に安全ではありません。ただし、トランスポートセキュリティを使用した基本認証は、ダイジェスト認証よりもはるかに安全です。そして、OAuth 1は完全に異なる獣であり、完全に直交するセキュリティ問題を抱えています。
リッチリマー2017年

@LesHazlewood侵害されたクライアントがパスワードを公開できると言うのは不公平です。妥協したクライアントとは、単にすべての賭けが無効になっていることを意味します。ただし、非推奨の警告は公平です。
ヌレティン2018

10

OSXでnode.js 0.6.7を使用していて、 'Authorization':authがプロキシで機能しないので、テストコードは 'Proxy-Authorization':authに設定する必要があります。 :

var http = require("http");
var auth = 'Basic ' + new Buffer("username:password").toString('base64');
var options = {
    host: 'proxyserver',
    port: 80,
    method:"GET",
    path: 'http://www.google.com',
    headers:{
        "Proxy-Authorization": auth,
        Host: "www.google.com"
    } 
};
http.get(options, function(res) {
    console.log(res);
    res.pipe(process.stdout);
});

3
将来の読者のために:宛先Webサーバー(Google)ではなくプロキシサーバーで認証しているためです。宛先サーバーで認証する必要がある場合は、Authorizationヘッダーを使用します。
Maks 2013

はいしかし、多くの場合、あなたはこれが固体の答えですので、両方を行う必要があります
モンドレイモンド

セキュリティおよびユーザビリティの問題のため、Buffer()は推奨されません。代わりにBuffer.alloc()、Buffer.allocUnsafe()、またはBuffer.from()メソッドを使用してください
Sourabh

6
var http = require("http");
var url = "http://api.example.com/api/v1/?param1=1&param2=2";

var options = {
    host: "http://api.example.com",
    port: 80,
    method: "GET",
    path: url,//I don't know for some reason i have to use full url as a path
    auth: username + ':' + password
};

http.get(options, function(rs) {
    var result = "";
    rs.on('data', function(data) {
        result += data;
    });
    rs.on('end', function() {
        console.log(result);
    });
});

2

最近これに遭遇しました。Proxy-AuthorizationヘッダーとAuthorizationヘッダーのどちらを設定するかは、クライアントが通信しているサーバーによって異なります。Webサーバーの場合は認証を設定する必要があり、プロキシの場合はProxy-Authorizationヘッダーを設定する必要があります


1

このコードは、多くの調査の後、私の場合に機能します。リクエストnpmパッケージをインストールする必要があります

var url = "http://api.example.com/api/v1/?param1=1&param2=2";
var auth = "Basic " + new Buffer(username + ":" + password).toString("base64");
exports.checkApi = function (req, res) {
    // do the GET request
    request.get({
        url: url,
        headers: {
            "Authorization": auth
        }
    }, function (error, response, body) {
        if(error)
       { console.error("Error while communication with api and ERROR is :  " + error);
       res.send(error);
    }
        console.log('body : ', body);
        res.send(body);      

    });    
}

セキュリティおよびユーザビリティの問題のため、Buffer()は推奨されません。代わりに、Buffer.alloc()、Buffer.allocUnsafe()、またはBuffer.from()メソッドを使用してください
Sourabh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.