j4nk3y: Node.js Session / Cookie

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

  1. 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.

    1. Hey,

      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.

      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

      1. 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.

        1. 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.

          • Bei PHP nachdem der Request bearbeitet wurde und ein Ergebnis zum Client geschickt wurde
          • Bei Node.js wenn der Socket beendet wird (disconnect-event).

          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

    2. Hey,

      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.

      Habs gefunden. Vielen Dank!

      session.startSession( socket.request, socket.request.res, function() {
      		console.log(socket.request.session)
      });
      

      Gruß
      Jo

  2. Was hättet ihr für Vorschläge?

    Eine Session erzeugst Du wie folgt:

    1. Der Browser requestet /anypage.html, einen Cookie hat er noch nicht dabei,
    2. der Server fragt den Cookie namentlich ab, generiert eine SID (64 oder 128 bit) und sendet den Cookie mit dieser SID im HTTP-Response-Header,
    3. der Browser nimmt den Cookie an und sendet diesen bei jedem weiteren Request im HTTP-Request-Header zurück,
    4. der Server bekommt nun eine SID im Request und sieht keinen Grund, eine neue SID zu erzeugen, ein Set-Cookie-Header kann nun auch entfallen.

    und das ist keine Frage der serverseitigen Software. MfG