2010-04-11 10 views

Odpowiedz

6

Po prostu pobierz pliki cookie z parametru Set-Cookie w nagłówkach odpowiedzi i wyślij je z późniejszymi żądaniami. Nie powinno być trudne.

+12

Jeśli nie jest to trudne, może w odpowiedzi możesz podać przykładowy fragment kodu? –

27

Krótka odpowiedź: nie. I nie jest tak świetnie.

Zaimplementowałem to jako część npm, aby móc pobierać paczki z github. Oto kod, który to robi: https://github.com/isaacs/npm/blob/master/lib/utils/fetch.js#L96-100

var cookie = get(response.headers, "Set-Cookie") 
if (cookie) { 
    cookie = (cookie + "").split(";").shift() 
    set(opts.headers, "Cookie", cookie) 
} 

Plik dostał dużo NPM-specyficzne rzeczy (log, zbiór, itp), ale powinien to pokazać ogólną ideę. Zasadniczo zbieram pliki cookie, aby móc je przesłać na następną prośbę po przekierowaniu.

Rozmawiałem z Mikem Rogers o dodaniu tego rodzaju funkcji do jego "żądania" wykorzystania, wraz z obsługą wspieranego przez system plików cookiejar, ale to naprawdę bardzo trudne. Musisz śledzić, do których domen wysłać pliki cookie, i tak dalej.

To prawdopodobnie nigdy nie będzie dołączone bezpośrednio do węzła, z tego powodu. Ale zwróć uwagę na zmiany w przestrzeni użytkownika.

EDYCJA: Jest to teraz obsługiwane domyślnie w Żądanie.

4

Jeśli szukasz zrobić ciasteczka stronie klienta można użyć https://github.com/mikeal/request

M.

+1

Próbowałem go przez "jar: true", jak opisano w ich doc, ale nie działa ... –

2

Poniższy kod demonstruje za pomocą plików cookie od strony serwera, oto serwer demo API analizować cookies z klientem HTTP i sprawdzić hash cookies:

var express = require("express"), 
app  = express(), 
hbs = require('hbs'), 
mongoose = require('mongoose'), 
port = parseInt(process.env.PORT, 10) || 4568; 

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.static(__dirname + '/public_api')); 
app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 
app.get('/api', function (req, res) { 
    var cookies = {}; 
    req.headers.cookie && req.headers.cookie.split(';').forEach(function(cookie) { 
     var parts = cookie.split('='); 
     cookies[ parts[ 0 ].trim() ] = (parts[ 1 ] || '').trim(); 
    }); 
    if (!cookies['testcookie']) { 
     console.log('First request'); 
     res.cookie('testcookie','testvaluecookie',{ maxAge: 900000, httpOnly: true }); 
     res.end('FirstRequest'); 
    } else { 
     console.log(cookies['testcookie']); 
     res.end(cookies['testcookie']); 
    } 
}); 

app.listen(port); 

po stronie klienta, po prostu zrobić normalne żądanie do serwera API powyżej, używam moduł wniosek, że transfery domyślne ciasteczka dla każdego żądania.

request(options, function(err, response, body) {  
    console.log(util.inspect(response.headers)); 
    res.render("index.html", {layout: false,user: { 
     username: req.session.user + body 
    }}); 
}); 
2

Cechą-kompletne rozwiązanie dla ciasteczek

Samodzielne rozwiązań zaproponowanych w innych odpowiedzi tutaj nie obejmują wiele szczególnych przypadkach, można łatwo złamać i brakuje wiele standardowych funkcji, takich jako uporczywość.

Jako mentioned by isaacs, moduł request ma teraz prawdziwą obsługę plików cookie. They provide examples with cookies on their Github page. Przykłady wyjaśniają, jak włączyć obsługę plików cookie, dodając do zapytania numer "tough-cookie" cookie jar.

UWAGA: Słoik z ciasteczkami zawiera i pomaga w zarządzaniu plikami cookie.

Cytując ich Readme (od kwietnia 2015):

Cookies są domyślnie wyłączone (jeszcze, że zostaną wykorzystane w kolejnych żądań). Aby włączyć obsługę plików cookie, ustaw jar na true (w ustawieniach domyślnych lub opcjach ) i zainstaluj tough-cookie.

Zarządzanie plikami cookie odbywa się przez tough-cookie module. Jest to stabilne, raczej funkcjonalne narzędzie do zarządzania plikami cookie, które implementuje "HTTP State Management Mechanism" - RFC 6265. Oferuje nawet wiele opcji do utrzymywania (przechowywania) plików cookie za pomocą cookie store.

Powiązane problemy