Session wird nicht vernünftig gespeichert

  • Hallo, ich versuche momentan ein Login Script zu bauen und verstehe etwas nicht: Wenn ich mich erfolgreich einlogge, wird Serverseitig die SESSION "loggedIn" erstellt und auf true gesetzt.

    Wenn ich dann allerdings eine fetch Request an eine Php Datei schicke, welche mir einfach den Wert von "loggedIn" anzeigen soll, gibt es diese Variable nicht mehr. Dann ist die ganze SESSION nicht mehr existent.


    Das php Script, welches true oder false zurückgibt:

    PHP
    1. <?php
    2. session_start();
    3. if(isset($_SESSION['loggedIn'])) {
    4. echo json_encode(['isLoggedIn' => true]);
    5. }else {
    6. echo json_encode(['isLoggedIn' => false]);
    7. }
    8. ?>

    Da kommt andauernd false bei raus.


    Ich glaub zwar nicht, dass da benötigt wird, aber hier die fetch Request:

    Code
    1. fetch('http://localhost:80/backend/isLoggedIn.php')
    2. .then(response => response.json())
    3. .then(data => setLoggedIn(data.isLoggedIn));

    Ich arbeite mit 2 unterschiedlichen Ports und habe dafür CORS abgestellt.

    Das komische ist, dass alles einwandfrei funktioniert, wenn ich eine andere Website verwende, welche auch auf Port 80 läuft. Dann bleibt die Session bestehen und dann gibt das php Script auch true zurück.


    Zur kurzen Erklärung, damit keiner verwirrt ist: Ich entwickle momentan ein Projekt neu. Das Originale liegt nach wie vor auf Port 80 und funktioniert einwandfrei. Das neue Projekt wird mit node entwickelt und liegt daher auf Port 3000. Für das Backend steuer ich aber die genau gleichen Scripte an.

  • Und das ist mal wieder ein wunderschönes Beispiel davon, wie man google richtig nutzt.


    Ich habe jetzt 2 Tage lang mehrere Stunden versucht diesem Problem auf dem Grund zu gehen, dass das Problem mit der fetch API zusammen hängen könnte, hätte ich niemals gedacht. Danke!

  • Sempervivum Das führt jetzt zu weiteren Problemen und beißt sich mit Header Set Access-Control-Allow-Origin - in der htaccess festgelegt. Da hatte ich zuvor jeglichen Zugang zugelassen ('*'), doch wenn ich "credentials" auf include setzen möchte, möchte der Browser anscheinend eine genau festgelegte Domain oder einen true Wert. (Keine Ahnung was ich da machen muss) Doch in dem Fall muss ich wiederrum die "credentials" auf omit setzen und dann gehts wieder nicht.


    Keine Ahnung wie ich was genau einstellen muss, ich empfinde das alles um ehrlich zu sein einfach nur als unnötig kompliziert. Hast du da vielleicht ne einfache Lösung?

  • Ich vermute stark, dass die Browserentwickler das aus Sicherheitsgründen so gemacht haben: Wenn Du beliebigen Zugang zulässt, könnte ja eine fremde Site sich in die Session einklinken und Daten und SESSION-Variablen ausspionieren. Wenn ich das richtig sehe, brauchst Du gar keinen Cross-Domain-Access sondern kannst die Domain deiner Site in Header Set Access-Control-Allow-Origin angeben.

  • Von .htaccess habe ich jetzt leider fast keine Ahnung. Du wirst sicher deine Gründe haben, Cross-Origin-Access freizugeben. Daher wahrscheinlich speziell für die Datei um die es geht, anders setzen. Auf jeden Fall kann man den Header nicht nur mit .htaccess setzen sondern auch für die aktuell aufgerufene Datei mit PHP. Das habe ich schon praktiziert, aber die Syntax habe ich nicht mehr im Kopf, müsste ich nachschlagen.

  • Wie gesagt, ich arbeite mit 2 unterschiedlichen Ports, deswegen muss ich cors deaktivieren. Im production build wäre das dann nicht mehr nötig, dann läuft wieder alles auf einem Port. Daher ist es auch eher unsinnig jetzt die ganzen php Dateien abzuändern. Am besten wäre es, wenn ich eine einfache Serverkonfiguration umstellen könnte.

  • Verstehe, ich erinnere mich, so etwas gelesen zu haben und das ist natürlich ein Grund. Werden denn sehr viele oder alle Dateien mit fetch aufgerufen? Ich dachte, es sei nur eine, daher mein Anregung bzgl. PHP. Wenn es viele oder alle sind, hast Du natürlich Recht, eine Serverkonfiguration ist sinnvoller. Aber mit .htaccess ist es doch sicher möglich, nur eine bestimmte Domain freizugeben?

  • Sobald ich die bestimmte Domain freigebe, kommt eine Fehlermeldung zu der ich keine Lösung finde und die ich auch nicht wirklich verstehe:


    Dazu gibt es einen Link, der helfen soll: https://developer.mozilla.org/…RSMissingAllowCredentials


    Da steht, man soll bei fetch requests die "credentials" auf omit stellen, dann habe ich aber wieder das SESSION Problem, also dass keine cookies bei der fetch request mitgesendet werden und der Server somit ständig neue sessions erstellt.