Express stellt kein Cookie ein

9

Ich habe Probleme mit dem Setzen von Cookies per Express. Ich benutze Este.js dev stack und versuche ein Cookie in der API auth /login route zu setzen. Hier ist der Code, den ich in /api/v1/auth/login route

%Vor%

In src/server/main.js Ich habe cookie-parser als erste Middleware registriert

%Vor%

Der Antwortkopf für /api/v1/auth/login route enthält

%Vor%

aber der Cookie wird nicht im Browser gespeichert ( document.cookie ist leer, auch Resources - Cookies tab in develepoers tools ist leer): (

BEARBEITEN: Ich habe festgestellt, dass wenn ich dies in /api/v1/auth/login (ohne Aufruf res.send oder res.json )

res.cookie('token', jwt.token, {expires: new Date(Date.now() + 9999999), httpOnly: false}); next();

Dann wird der Cookie gesetzt UND der Antwort-Header hat X-Powered-By:Este.js ... gesetzt. Dies setzt esteMiddleware in expres Frontend-Rendering-Teil .

Wenn ich res.send

verwende %Vor%

Dann erhalte ich den Fehler Can't set headers after they are sent. , weil send method verwendet wird, damit der Frontend-Render diesen Fehler auslöst.

Aber ich muss Daten von API senden, also wie kann ich damit umgehen?

Können mir manche bitte helfen? Danke!

    
Mira 24.04.2016, 14:01
quelle

3 Antworten

13

Ich hatte das gleiche Problem. Die Serverantwort enthält einen Cookie-Satz:

%Vor%

Aber der Cookie wurde nicht von einem Browser gespeichert.

So habe ich es gelöst.

Ich verwende fetch in einem clientseitigen Code. Wenn Sie die Optionen credentials: 'include' in fetch nicht angeben, werden Cookies weder an den Server gesendet noch von einem Browser gespeichert, obwohl die Serverantwort Cookies festlegt.

Beispiel:

%Vor%

Ich hoffe, es hilft jemandem.

    
Green 11.03.2017 12:11
quelle
1

Ich arbeite mit Express 4 und Knoten 7.4 und eckig, ich hatte das gleiche Problem mir helfen, dies:
a) Server-Seite: In der Datei app.js gebe ich alle Antworten wie:

%Vor%

das muss vor allen routern sein .
Ich habe viele dieser Header gesehen:

%Vor%

aber ich brauche das nicht,

b) Wenn Sie Cookie definieren, müssen Sie httpOnly: false wie:

hinzufügen %Vor%

c) clientseitig: In send ajax brauchen Sie add: "withCredentials: true" wie:

%Vor%

viel Glück.

    
izik f 06.02.2017 08:07
quelle
0

Es gibt ein paar Probleme:

  • Ein Cookie, der nicht explizit mit httpOnly : false festgelegt wurde, wird nicht über document.cookie im Browser aufgerufen. Es wird immer noch mit HTTP-Anfragen gesendet, und wenn Sie die Dev-Tools Ihres Browsers überprüfen, werden Sie höchstwahrscheinlich den Cookie dort finden (in Chrome finden Sie sie im Ressourcen Tab der Dev-Tools);
  • Das next() , das Sie anrufen, sollte nur verwendet werden, wenn Sie das Zurücksenden einer Antwort an einen anderen Teil Ihrer Anwendung verzögern möchten, was nach Ihrem Code nicht Ihren Vorstellungen entspricht.

Es scheint mir also, dass dies Ihre Probleme lösen sollte:

%Vor%

Als Nebenbemerkung: Es gibt einen Grund dafür, dass httpOnly standardmäßig auf true gesetzt ist (um zu verhindern, dass bösartige XSS-Skripts auf Sitzungscookies und dergleichen zugreifen). Wenn Sie keinen sehr guten Grund haben, über clientseitige JS auf den Cookie zugreifen zu können, setzen Sie ihn nicht auf false .

    
robertklep 26.04.2016 08:01
quelle

Tags und Links