Jak używać http.client w Node.js, jeśli istnieje podstawowa autoryzacja


105

Zgodnie z tytułem, jak mam to zrobić?

Oto mój kod:

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 jest przestarzałe. Zamiast tego użyj „http.request”.
— thomas-peter

Odpowiedzi:


271

Musisz ustawić Authorization pole w nagłówku.

Zawiera typ uwierzytelniania Basicw tym przypadku i username:passwordkombinację, która zostaje zakodowana w Base64:

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
Tak to właśnie działa. Serwer oczekuje, że dane zostaną zakodowane w standardzie Base64.
— Ivo Wetzel

3
Co to jest „klient” w tym przykładzie?
— Steven Soroka

1
och… to jest pytanie. duh. nm.
— Steven Soroka

Wow, super, naprawdę mi pomogło!
— Chris Allinson,

61

Z http.request API Docs Node.js możesz użyć czegoś podobnego do

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
Oto współczesna odpowiedź.
— David Jones,

2
Czy musisz wykonać „użytkownik: hasło” lub „Użytkownik podstawowy: hasło”?
— Katie

2
@kayvar Nie, nie musisz poprzedzać go przedrostkiem Basic.
— Sujay

@MarceloFilho To jest to, co widzę na dokumentach nadal auth <string> Podstawowe uwierzytelnianie, tj. „Użytkownik: hasło”, aby obliczyć nagłówek autoryzacji.
— 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
Funkcja Buffer () jest przestarzała ze względu na problemy z bezpieczeństwem i użytecznością. Zamiast tego użyj metod Buffer.alloc (), Buffer.allocUnsafe () lub Buffer.from ()
— Sourabh

13

Łatwiejszym rozwiązaniem jest użycie formatu user: pass @ host bezpośrednio w adresie URL.

Korzystanie z biblioteki żądań :

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
    }
);

Napisałem też o tym mały post na blogu .


18
Nie jest to idealna rada: jakiekolwiek rejestrowanie adresów URL po stronie klienta lub serwera może ujawnić wartości haseł - jest to powszechnie znany wektor ataku na bezpieczeństwo. Zdecydowanie nie zalecam nikomu tego robić. Wartości nagłówków są lepsze, a brak uwierzytelniania podstawowego - na korzyść uwierzytelniania Digest lub OAuth 1.0a (na przykład) jest jeszcze lepszy. Ta forma identyfikacji została również przestarzała w identyfikatorach URI w dokumencie RFC 3986.
— Les Hazlewood,

Brak podstawowego uwierzytelniania brzmi jak zła rada. Autoryzacja podstawowa wymaga zabezpieczenia transportu lub jest całkowicie niepewna, tak. Ale podstawowe uwierzytelnianie z zabezpieczeniami transportu jest o wiele bezpieczniejsze niż uwierzytelnianie Digest. A OAuth 1 to zupełnie inna bestia z całkowicie ortogonalnymi problemami z bezpieczeństwem.
— bogate wspomnienie

@LesHazlewood Nie jest sprawiedliwe twierdzenie, że klienci, których bezpieczeństwo zostało naruszone, mogą ujawniać hasła. Narażony klient oznacza po prostu, że wszystkie zakłady są wyłączone. Jednak ostrzeżenie o wycofaniu jest sprawiedliwe.
— nurettin

10

co jest warte Używam node.js 0.6.7 na OSX i nie mogłem uzyskać `` Autoryzacji '': autoryzacja do pracy z naszym proxy, musiała być ustawiona na `` Proxy-Authorization '': autoryzuj mój kod testowy to :

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
Dla zbudowania przyszłych czytelników: To dlatego, że uwierzytelniasz się na serwerze proxy, zamiast uwierzytelniać na docelowym serwerze internetowym (Google). Gdybyś musiał uwierzytelnić się na serwerze docelowym, nagłówek Authorization byłby tym, czego chcesz użyć.
— Maks.

Tak, ale często musisz zrobić jedno i drugie, więc jest to solidna odpowiedź
— Mond Raymond,

Funkcja Buffer () jest przestarzała ze względu na problemy z bezpieczeństwem i użytecznością. Zamiast tego użyj metod Buffer.alloc (), Buffer.allocUnsafe () lub 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

Niedawno się z tym spotkałem. To, które spośród nagłówków Proxy-Authorization i Authorization zależy od serwera, z którym rozmawia klient. Jeśli jest to serwer WWW, musisz ustawić autoryzację, a jeśli jest to proxy, musisz ustawić nagłówek Proxy-Authorization


1

Ten kod działa w moim przypadku po wielu badaniach. Będziesz musiał zainstalować pakiet npm żądania .

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);      

    });    
}

Funkcja Buffer () jest przestarzała ze względu na problemy z bezpieczeństwem i użytecznością. Zamiast tego użyj metod Buffer.alloc (), Buffer.allocUnsafe () lub Buffer.from ()
— Sourabh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.