Speicherdauer der Cookies ändern

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Wenn meine User sich auf einem fremden Gerät einloggen, sollte das Cookie, in dem ihr Login gespeichert wird nach dem Ausloggen gelöscht werden. Dazu möchte ich ein entsprechenden Feld beim Einloggen einfügen - wie greife ich aber auf diese Speicherdauer zu?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Unter Django hast Du gar kein Problem damit, da der Cookie ja nur auf einen Eintrag in Deiner Datenbank verweist. Du löschst also einfach den Datenbankeintrag.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Sorry dafür, aber auch hier muss ich wieder feststellen, dass ich das ganze nicht wirklich verstanden habe. Ich bin davon ausgegangen, dass, wenn ich mich im "Rechentrainer" einlogge, ein Cookie irgendwo in den Tiefen meines Computers gespeichert wird, mein Browser dies erkennt und auch, auf Wunsch" mein Passwort speichert und du sagst jetzt, dies verweist auf eine Eintrag auf meine Datenbank. Wie und vor allem wann lösche ich diesen Eintrag und wo finde ich ihn? Und was mache ich mit dem Cookie?
Es wäre prima, wenn du mir das mit dem Cookie und der Datenbank für Dummies erklären könntest. (Ich muss das ja auch irgendwie in meiner Datenschutzerklärung einbauen.)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Cookie ist nur ein zufaelliger String. Dinge wie welcher User sich dahinter verbirgt, Zustand der Session, etc, wird eben alles in der DB gespeichert, und bei jedem Request da wieder rausgeholt (ggf. wird auch was gecacht, aber grundsaetzlich ist es ja wuenschenswert, den Server auch mal neu starten zu koennen oder die Last auf mehrere zu verteilen, und darum persistiert man das).

https://docs.djangoproject.com/en/4.1/t ... /sessions/

"By default, Django stores sessions in your database"
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Also, lass es mich mal probieren:
Ich registriere mich erstmalig mit meinem Gerät beim Rechentrainer - oder logge mich neu ein. In der Datenbank des Rechentrainers wird ein Eintrag erstellt und auf meinem Gerät ein zufälliger String erzeugt und als Cookie auf meinem Computer gespeichert und während ich mit diesem Gerät am Rechentrainer arbeite, erkennt mich der Server. Was passiert, wenn ich mich auslogge und später mit dem gleichen Gerät einlogge? Der Server findet das Cookie (oder auch umgekehrt) und der Server weiß, wer ich bin. Das zugehörige Passwort speichert (auf Wunsch) mein Browser. Wenn ich das Cookie beim Abmelden lösche:
set_expiry(value)¶
Sets the expiration time for the session. You can pass a number of different values:
If value is 0, the user’s session cookie will expire when the user’s web browser is closed.
erkennt mich der Server nicht mehr und ich muss mich neu einloggen? Und wenn das Cookie noch da ist, erkennt der Server mich und wenn der Browser mein Passwort gespeichert hat, werde ich auch automatisch eingeloggt? (so geht es mir zurzeit, wenn ich mich am localhost anmelde).
Was passiert aber jetzt, wenn, wie beschrieben user1 sich an einem Schulcomputer einloggt und dem Server auch erlaubt sein Passwort zu speichern (im Gegensatz zur gängigen Meinung, musste ich feststellen, dass meine Schüler (ich lasse jetzt mal die .innen weg) keineswegs alle mit Computern umgehen können.), wie verhindere ich, dass user2 jetzt am gleichen Gerät in den Daten von user1 rumpfuscht.

Und was passiert genau mit dem Code in meinem View (den ich von @whitie übernommen habe (ohne ihn zu verstehen)):
Beim Erstellen der Aufgabe:

Code: Alles auswählen

            req.session['protokoll_id'] = protokoll.id    
            req.session['zaehler_id'] = zaehler.id 
und bei der Kontrolle der Usereingabe:

Code: Alles auswählen

            protokoll = Protokoll.objects.get(pk = req.session.get('protokoll_id'))
            zaehler = Zaehler.objects.get(pk = req.session.get('zaehler_id'))
... wird da ebenso jeweils ein Eintrag in der Datenbank erstellt und einem Cookie zugeordnet?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn der Cookie nicht entfernt wird, oder sich sauber ausgeloggt, dann bleibt der user eingeloggt. Da kann man wenig machen. Ich weiß nicht, wie Rechner in der Schule heutzutage konfiguriert sind. Ich würde hoffen, das ist so wie in Internet Cafés, wo die Einstellungen nach jedem System-Logout komplett entfernt werden.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Um das nochmal klarzustellen: du kannst durch eine eigen logout-Funktion natuerlich sicherstellen, dass das Cookie geloescht bzw. ungueltig gemacht wird. Aber *ob* das passiert, darueber hast du natuerlich keine Kontrolle. Wenn der Schueler aufspringt und rausrennt, hat der naechste Zugriff.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

__deets__ hat geschrieben: Sonntag 22. Januar 2023, 19:07 Um das nochmal klarzustellen: du kannst durch eine eigen logout-Funktion natuerlich sicherstellen, dass das Cookie geloescht bzw. ungueltig gemacht wird. Aber *ob* das passiert, darueber hast du natuerlich keine Kontrolle. Wenn der Schueler aufspringt und rausrennt, hat der naechste Zugriff.
OK, das ist logisch. Aber, sagt mir, ist das Procedere, so wie ich es beschrieben habe, stimmig? Wo ist der Unterschied, ob ich auf einer Webseite "Anmeldung speichern" anklicke, oder nicht? Macht es Sinn, auf fremden Geräten, dieses "Anmelde"cookie zu löschen? Und, wenn ja, wie?
Wie, und wo setzt man dieses
set_expiry(value)¶
If value is 0, the user’s session cookie will expire when the user’s web browser is closed.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Dokumentation beschreibt das alles ziemlich ausführlich:
https://docs.djangoproject.com/en/4.1/t ... t-sessions
https://docs.djangoproject.com/en/4.1/t ... uth.logout
Und natürlich hilft es, zum Einstieg die ganze Seite zu lesen: https://docs.djangoproject.com/en/4.1/t ... /sessions/
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Also folgendes habe ich jetzt verstanden:
Beim Registrieren erzeugt der Server eine zufällige Zahlenkombination und verknüpft diese mit dem User und speichert dies in seiner Datenbank. Außerdem schickt er diesen String zum Hostgerät und dort wird dieser als Cookie gespeichert. Zusätzlich werden meine req.session['protokoll_id'] und req.session['zaehler_id'] im gleichen Eintrag in der Datenbank auf dem Server gespeichert und bei jeder Aufgabe erneuert. Dadurch erkennt der Server jeden Kontakt mit dem Host und kann ihn richtig zuordnen. Das Cookie wird im Normalfall 2 Jahre lang gespeichert.
Ich habe jetzt im Login Template eine Checkbox ergänzt "Ich arbeite nicht an meinem eigenen Gerät, bitte Cookies nach der Abmeldung löschen" das den Code "req.session.set_expiry(0)" ausführt. Der User muss sich beim nächsten Besuch der Seite neu einloggen. Vermutlich wird dann auch ein neuer Eintrag in der Datenbank erzeugt.
Ich habe aber nach Anforderung im Datenschutz eine Option eingefügt, mit dem der User seinen Account und alle Daten löschen kann "user.delete()". Das funktioniert auch (ich musste noch "logout(req)" ergänzen). Ich weiß allerdings nicht, ob dabei auch das Cookie gelöscht wird. Sollte es ja wahrscheinlich.
Antworten