2016-01-18 15 views
7

Sto utilizzando il pacchetto request per creare le mie richieste lato server. Ho scritto il middleware di autenticazione che verifica l'identificazione di un cookie/sessione per tutte le richieste. Pertanto, c'è un modo per includere il cookie dell'utente come parte della richiesta? Ecco il mio codice corrente:Passa cookie come parte della richiesta 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'); 
}); 

Attualmente, restituisce "nessun cookie trovato" nella console. Tuttavia, se spengo il mio middleware di autenticazione, il codice sopra funziona come previsto.

Ulteriori informazioni:

Il cookie che voglio è cookie dell'utente finale situato sul browser. cookie dell'utente finale viene creato l'applicazione ogni volta che l'utente accede a

Aggiornamento - soluzione di tentativo 1:.

Ho provato questo dalla documentazione:

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

Tuttavia, la console è ancora tornando 'Nessun cookie trovato'

Qualcuno può aiutare?

Grazie in anticipo!

+0

Avrete top spiegare di più su ciò che Cookie che si desidera inviare? Il cookie di un utente finale è memorizzato nel suo browser ed è associato in modo univoco a un determinato browser e un particolare dominio e viene inviato a quel dominio con qualsiasi richiesta dal browser a quel dominio. Per favore descrivi quali cookie stai chiedendo. Se il cookie appartiene a un dominio diverso da quello in cui si trova il server, il server non avrà accesso a quel cookie. – jfriend00

+0

@ jfriend00 - ho aggiornato la mia domanda. Grazie! –

+0

In quale dominio e porta è stato creato il cookie? Su quale dominio e porta è acceso il tuo server? – jfriend00

risposta

13

Lasciami spiegare i cookie e questo probabilmente ti mostrerà perché è difficile ottenere il cookie che desideri.

  1. Quando il browser del tuo utente accede in http://localhost:3000, quel server crea un cookie di login e la restituisce come parte della risposta di accesso.
  2. Quando il browser riceve quel cookie, salva tale cookie permanentemente all'interno del browser e associa tale cookie al dominio http://localhost:3000 e alla porta.
  3. Quando l'utente effettua nuovamente una richiesta a http://localhost:3000, il browser invia tutti i cookie precedentemente salvati per quel particolare dominio e porta con la richiesta al server.
  4. Quando il server riceve la richiesta, può esaminare tutti i cookie inviati con la richiesta.
  5. Quando il browser inoltra una richiesta a un server diverso o addirittura allo stesso server, ma su una porta diversa, il browser NON invia i cookie salvati in precedenza con quella richiesta poiché tali cookie appartengono a un server e una porta diversi. Il browser utilizza grandi quantità di sicurezza per inviare i cookie solo ai server a cui appartengono i cookie. Dato che i cookie spesso forniscono accesso di accesso, puoi vedere chiaramente perché è importante che cose come i cookie delle credenziali di accesso non vengano inviate ai server a cui non devono essere inviati.

Ora, sul tuo codice node.js. Si mostra un blocco di codice node.js che sta tentando di accedere allo stesso server http://localhost:3000. Ma i cookie sono memorizzati nel browser dell'utente. Il codice node.js non può ottenerli dal browser poiché il browser li protegge e li rivela solo quando il browser stesso invia una richiesta a http://localhost:3000.


Se si dispone effettivamente del cookie corretto nel nodo.js codice, quindi è possibile impostare su vostra richiesta in questo modo:

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

i documenti adeguati alle intestazioni personalizzate nel modulo request è here.

+0

Giusto, ma la mia prima riga di codice contiene il cookie. Quindi tecnicamente ho già il cookie, che sto cercando di passare come parte della mia funzione 'request'. –

+0

@ user1547174 - Se si dispone effettivamente del cookie corretto, è sufficiente aggiungerlo come intestazione alla richiesta che si sta inviando, come illustrato alla fine della risposta. – jfriend00

+0

L'ho trovato momentaneamente dopo. Molte grazie!! –

4

Risposta:

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

funziona? magari aggiungi del testo per spiegare perché è diverso dall'OP –

+0

ad esempio, che cos'è parseCookie? –

Problemi correlati