2016-01-18 13 views
7

Używam pakietu request do tworzenia żądań po stronie serwera. Napisałem oprogramowanie pośredniczące do uwierzytelniania, które sprawdza identyfikator pliku cookie/sesji dla wszystkich żądań. Czy istnieje sposób, w jaki włączam plik cookie użytkownika jako część żądania? Oto mój obecny kod:Przełóż ciasteczko jako część żądania node.js

var cookie = parseCookie.parseCookie(req.headers.cookie); 

request('http://localhost:3000/users/api', function(error, response, body) { 
    console.log(body); //this console.logs my login page since requests w/o valid cookies get redirected to login 
    res.render('../views/admin'); 
}); 

Obecnie ta funkcja zwraca "brak pliku cookie" w konsoli. Jeśli jednak wyłączyłem oprogramowanie pośredniczące do uwierzytelniania, powyższy kod działa zgodnie z przeznaczeniem.

Dodatkowe informacje:

cookie chcę to cookies użytkownik końcowy mieści w przeglądarce. cookies użytkownik końcowy jest tworzony przez aplikację, gdy użytkownik loguje się

Update - roztwór próby. 1:

Próbowałem to z dokumentacji:

var cookie = parseCookie.parseCookie(req.headers.cookie); 
var cookieText = 'sid='+cookie; 
var j = request.jar(); 
     var cookie = request.cookie(cookieText); 
     var url = 'http://localhost:3000/users/api'; 
     j.setCookie(cookie, url); 
     request({url: url, jar: j}, function(error, response, body) { 
      request('http://localhost:3000/users/api'); 
     }); 

Jednak konsola jest nadal powrocie "nie znaleziono pliku cookie"

Czy ktoś może pomóc?

Z góry dziękuję!

+0

Będziesz mieć top wyjaśnić więcej o co Cookie chcesz wysłać? Plik cookie użytkownika końcowego jest przechowywany w przeglądarce i jest jednoznacznie powiązany z określoną przeglądarką i określoną domeną i jest wysyłany do tej domeny z wszelkimi żądaniami przeglądarki do tej domeny. Opisz, o które pliki cookie pytasz. Jeśli plik cookie należy do innej domeny niż serwer, oznacza to, że serwer nie będzie miał dostępu do tego pliku cookie. – jfriend00

+0

@ jfriend00 - zaktualizowałem moje pytanie. Dzięki! –

+0

Na jakiej domenie i porcie utworzono plik cookie? Jaką domeną i portem jest twój serwer? – jfriend00

Odpowiedz

13

Pozwól mi wyjaśnić na temat plików cookie i to prawdopodobnie pokaże Ci, dlaczego trudno jest uzyskać żądany plik cookie.

  1. Gdy przeglądarka użytkownika zaloguje się do http://localhost:3000, serwer tworzy plik cookie logowania i zwraca go jako część odpowiedzi logowania.
  2. Gdy przeglądarka otrzymuje taki plik cookie, zapisuje on plik cookie w przeglądarce i kojarzy ten plik cookie z domeną i portem http://localhost:3000.
  3. Gdy użytkownik ponownie wysyła żądanie do http://localhost:3000, przeglądarka wysyła wszystkie pliki cookie, które wcześniej zapisał dla tej konkretnej domeny i portu z żądaniem na serwer.
  4. Po otrzymaniu żądania przez serwer może sprawdzić wszystkie pliki cookie wysyłane wraz z żądaniem.
  5. Gdy przeglądarka wysyła żądanie do innego serwera lub nawet tego samego serwera, ale na innym porcie, przeglądarka NIE wysyła wcześniej zapisanych plików cookie z tym żądaniem, ponieważ te pliki cookie należą do innego serwera i portu. Przeglądarka stosuje duże zabezpieczenia, aby wysyłać pliki cookie tylko na serwery, do których należą pliki cookie. Ponieważ pliki cookie często zapewniają dostęp do logowania, możesz wyraźnie zobaczyć, dlaczego ważne jest, aby pliki cookie uwierzytelniające logowania nie były wysyłane na serwery, do których nie powinny być wysyłane.

Teraz przejdź do kodu node.js. Wyświetlasz blok kodu node.js, który próbuje uzyskać dostęp do tego samego serwera http://localhost:3000. Ale pliki cookie są przechowywane w przeglądarce użytkownika. Twój kod node.js nie może pobrać ich z przeglądarki, ponieważ przeglądarka je chroni i ujawni je tylko wtedy, gdy przeglądarka sama wyśle ​​żądanie na numer http://localhost:3000.


Jeśli rzeczywiście masz odpowiednie ciasteczko w swoim węźle.js kod, a następnie można ustawić go na życzenie tak:

request({url: 'http://localhost:3000/users/api', headers: {Cookie: somedataHere}}, function(error, response, body) { 
    console.log(body); //this console.logs my login page since requests w/o valid cookies get redirected to login 
    res.render('../views/admin'); 
}); 

Stosowna dokumentacja niestandardowych nagłówków w module request jest here.

+0

Dobrze, ale mój pierwszy wiersz kodu zawiera plik cookie. Więc technicznie mam już plik cookie, który próbuję przekazać jako część mojej funkcji 'request'. –

+0

@ user1547174 - Jeśli rzeczywiście masz właściwy plik cookie, możesz po prostu dodać go jako nagłówek do wysyłanego żądania, tak jak teraz pokazuję na końcu mojej odpowiedzi. – jfriend00

+0

Znalazłem to chwilę później. Wielkie dzięki!! –

4

Odpowiedź:

var cookie = parseCookie.parseCookie(req.headers.cookie); 
var cookieText = 'sid='+cookie; 
var options = { 
    url: 'https://api.github.com/repos/request/request', 
    headers: { 
    'User-Agent': 'request'. 
    'host': 'localhost:3000', 
    'cookie': cookieText //this is where you set custom cookies 
    } 
}; 

function callback(error, response, body) { 
    if (!error && response.statusCode == 200) { 
    var info = JSON.parse(body); 
    console.log(info.stargazers_count + " Stars"); 
    console.log(info.forks_count + " Forks"); 
    } 
} 

request(options, callback); 
+0

to działa? może dodać tekst wyjaśniający dlaczego różni się od OP –

+0

na przykład czym jest parseCookie? –

Powiązane problemy