기본 권한이있는 경우 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'를 사용하십시오.
thomas-peter

답변:


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"를 수행해야합니까?
Katie

2
@kayvar 아니요 Basic을 접두사로 사용할 필요는 없습니다.
Sujay

@MarceloFilho 이것은 문서에서 여전히 auth <string> 기본 인증 즉, Authorization 헤더를 계산하기위한 'user : password'입니다.
Sujay

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 형식을 사용하는 것입니다.

은 Using 요청 라이브러리 :

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에 사용되지 않습니다
레 Hazlewood

기본 인증을 사용하지 않는 것은 나쁜 조언처럼 들립니다. 기본 인증에는 전송 보안이 필요하거나 완전히 안전하지 않습니다. 그러나 전송 보안이있는 기본 인증은 다이제스트 인증보다 훨씬 더 안전합니다. 그리고 OAuth 1은 완전히 직교하는 보안 문제를 가진 완전히 다른 괴물입니다.
rich remer

@LesHazlewood 손상된 클라이언트가 암호를 노출 할 수 있다고 말하는 것은 공정하지 않습니다. 손상된 클라이언트는 단순히 모든 베팅이 해제되었음을 의미합니다. 그러나 지원 중단 경고는 공정합니다.
nurettin

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
미래 독자의 교화를 위해 : 대상 웹 서버 (google)로 인증하는 대신 프록시 서버로 인증하기 때문입니다. 대상 서버로 인증해야하는 경우 Authorization 헤더가 사용하려는 것입니다.
Maks

예,하지만 두 가지 모두를 수행해야하는 경우가 많으므로 이것은 확실한 답변입니다
Mond Raymond

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

나는 최근에 이것을 보았습니다. 중 어느 프록시 인증권한 부여 세트 헤더는 클라이언트가 이야기하는 서버에 따라 달라집니다. 웹 서버 인 경우 Authorization 을 설정해야 하며 프록시 인 경우 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.