Node.js Session / Cookie
j4nk3y
- javascript
- php
- sicherheit
0 1unitedpower0 j4nk3y1 1unitedpower0 j4nk3y
0 j4nk3y
0 pl
Einen Wunderschönen guten Abend zusammen,
nach meine Hauruckaktion mein PHP auf Objektorientiert umzuschreiben, bin ich relativ schnell dazu übergegangen alles von PHP auf Node.js/Socket.io zu migrieren.
Dabei konnte ich bis heute ein Problem noch nicht lösen.
Hättet ihr dort eine Idee? Die relevante Funktion sieht mittlerweile so aus:
login: function ( socket, data, callback ) {
session.startSession( socket.request, socket.response, function() {
}); // ??
}
Jedoch bei 'socket.response' bekomme ich immer einen Fehler 'TypeError: Cannot read property 'end' of undefined'. Und ich habe keine Ahnung was ich dagegen tun kann.
Wie dem auch sei habe ich mir auch schon überlegt ob ich ein eigenes Sessionsystem mit meiner Datenbank basteln sollte, bin aber schnell wieder davon ab als ich mir angesehen habe was mein Apache/PHP "alles" für eine Session speichert.
Eigentlich halte ich nicht viel von Cookies, vor allem weiss ich eigentlich gar nicht wofür man die braucht, da ich mich mit dem Thema noch nicht auseinander gesetzt habe.
Dennoch stellt sich mir die Frage ob ich Benutzerdaten in einem Cookie speichern kann, um sie dann mit meiner Datenbank zu vergleichen um wiederum einen Benutzer ohne direkten Login, Zugang zu gewähren.
Auch habe ich überlegt, ob ich umständlich PHP eine Session kreieren lasse um diese dann von Node.js aufzugreifen.
Was hättet ihr für Vorschläge?
Danke schön und noch einen schönen Abend.
Gruß
Jo
session.startSession erwartet als ersten Parameter einen Wert vom Typ http.ClientRequest
und als zweiten Parameter einen Wert vom Typ http.ServerResponse
. Du übergibst aber irgendwas was anderes.
Hey,
session.startSession erwartet als ersten Parameter einen Wert vom Typ
http.ClientRequest
und als zweiten Parameter einen Wert vom Typhttp.ServerResponse
. Du übergibst aber irgendwas was anderes.
Ja, der ClientRequest stollte in 'socket.request' stehen, so ich das denn richtig verstehe.
Aber 'socket.response' ist anscheinend nicht definiert, an dieser Stelle antwortet der Server auch noch garnicht. Ich bin da etwas verwirrt. [Und die Doku hilft mir auch gerade nicht weiter.]
Gruß
Jo
Ja, der ClientRequest stollte in 'socket.request' stehen, so ich das denn richtig verstehe.
Aber 'socket.response' ist anscheinend nicht definiert, an dieser Stelle antwortet der Server auch noch garnicht. Ich bin da etwas verwirrt. [Und die Doku hilft mir auch gerade nicht weiter.]
Also du hantierst mit zwei verschiedenen Protokollen: HTTP und WebSocket. HTTP ist zustandslos, das heißt jeder Request/Response-Zyklus ist unabhängig von den vorherigen und nachfolgenden Zykeln. Wenn man sich zwischen diesen Zykeln etwas über den Kommunikations-Verlauf zwischen Browser und Server merken will, dann speichert man die nötigen Informationen auf dem Server und sendet dem Browser eine eindeutige Kennung, mit der er sich wieder ausweisen kann. Diese eindeutige Kennung nennt man SessionId und benutzt einen Coookie, um sie über mehrere Request/Response-Zykel zu transportieren. WebSocket dagegen ist ein zustandsbehaftetes Protokoll, da ist dieser Umweg über den Cookie nicht nötig: Die Gesprächspartner wissen für die gesamte Lebensdauer der Kommunikation, wer ihr Gesprächspartner ist. Die Kommunikation wird nicht automatisch nach einem Request/Reponse-Zyklus beendet, sondern läuft weiter bis einer der Gesprächspartner sie ausdrücklich für beendet erklärt. Mit anderen Worten ausgedrückt, managt WebSocket die Session automatisch, bei HTTP muss der Anwendungsentwickler sie selber managen. Ein klares Verständnis für den Unterschied von zustandslosen und zustandsbehafteten Kommunikations-Protokollen ist unabdingbar, wenn du mit beiden Protokollen arbeitest, weil du sonst versuchst Konzepte vom einen in das andere Protokoll zu übertragen, die es dort nicht gibt oder braucht.
Hey,
Mit anderen Worten ausgedrückt, managt WebSocket die Session automatisch, bei HTTP muss der Anwendungsentwickler sie selber managen.
Soweit, soklar. Jedoch würde ich einen unterschied zwischen Session und Socket bevorzugen. Denn, was du beschreibst ist ein Socket in Node.js, welcher permanent zwischen Client und Server offen ist. Deshalb mache ich das ja auch. Nur möchte ich, so wie es mit PHP Sessions funktionierte, dass auch nachdem eine Verbindung unterbrochen wurde (*) diese wieder aufgebaut werden kann.
Und ich bin gerade auf der suche ob ich im socket
-Object ein response Element finde, da es laut Doku der zweite Eintrag im socket.request event sein soll.
Gruß
Jo
Hey,
session.startSession erwartet als ersten Parameter einen Wert vom Typ
http.ClientRequest
und als zweiten Parameter einen Wert vom Typhttp.ServerResponse
. Du übergibst aber irgendwas was anderes.
Habs gefunden. Vielen Dank!
session.startSession( socket.request, socket.request.res, function() {
console.log(socket.request.session)
});
Gruß
Jo
Was hättet ihr für Vorschläge?
Eine Session erzeugst Du wie folgt:
und das ist keine Frage der serverseitigen Software. MfG