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);
  });
});
de_3
źródło
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);
Ivo Wetzel
źródło
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();
Sujay
źródło
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);
  } );
Hamidreza Sadegh
źródło
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 .

Ochrypły
źródło
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);
});
vrtis
źródło
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);
    });
});
Manish Kumar
źródło
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

sdqali
źródło
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);      

    });    
}
Nimish goel
źródło
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