[3.0] [Cookie] Cookie ExpireTime immer 1970

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dr.e. » 14.04.2015, 21:01:05

Ausserdem: Grünes Licht, das UMGT läuft wieder rund.
Freut mich! Endlich geschafft! :)
Einzig der HtmlHeader macht noch Probleme, aber die Umsetzung ist ja auch noch nicht vollständig abgeschlossen.
Mit meinem Commit grade eben sollte die Umstellung des Codes hinsichtlich der ServiceManager-Änderung vollständig sein. Es fehlt noch ein Migrations-Skript. Wo siehst du da noch Probleme?
Ausserdem 2: Herzlichen Dank für deine erstklassige Unterstützung. :geek:
Vielen Danke! Es ist mir eine Ehre! :)
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 931
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dave » 14.04.2015, 21:07:31

dr.e. hat geschrieben: Mit meinem Commit grade eben sollte die Umstellung des Codes hinsichtlich der ServiceManager-Änderung vollständig sein. Es fehlt noch ein Migrations-Skript. Wo siehst du da noch Probleme?
Glücklicherweise nirgends mehr, sodass wir das Thema wirklich als beendet betrachten können. Das Problem, welches ich meinte betraf die CacheManagerFabric und das ist ja schon gelöst :)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dr.e. » 14.04.2015, 21:59:03

Jep, ist gelöst! Danke für den Hinweis! :)
Viele Grüße,
Christian

GeneralCrime
Beiträge: 89
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von GeneralCrime » 02.10.2015, 13:59:18

Hallo,
ich hänge grad bei der 2.1 Version daran das ich mich nicht Ausloggen kann.

UmgtLogoutAction löscht korrekt den User aus dem Store, das Cookie bleibt jedoch unverändert.
Somit schreibt die UmgtAutoLoginAction den User wieder in den Store.
Lösche ich den Cookie klappt alles wunderbar.

Habe mittels Debug das Script nach dem löschen angehalten und dann den Cookie angeschaut.
Das Ablaufdatum hat sich nicht verändert.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dr.e. » 03.10.2015, 09:11:47

Hi,

das ist natürlich blöd! Entweder der Browser nimmt den genutzten Wert (0 oder null auf dem Server) Nicht richtig an - das hatte ich schon einmal beobachtet - oder es ist wirklich ein Bug.

Funktioniert es in allen Browsern mit 2.1 nicht? Kannst du das Problem auch mit 3.0.1 nachstellen?
Viele Grüße,
Christian

GeneralCrime
Beiträge: 89
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von GeneralCrime » 03.10.2015, 17:56:55

Habe bei 2.1 nun mit Chrome (Standard) und FF versucht beides hat nicht Funktioniert.
Habe die 3.0.1 Version die Sandbox installiert und dort das UMGT. Habe mich eingeloggt mit (Login merken) dann kommt ja sie sind eingeloggt klicken sie hier, auch dieses fürte nicht zum Ausloggen!

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dr.e. » 03.10.2015, 21:25:58

Hi,

vielen Dank fürs Testen und validieren! Dann ist das offenbar ein Bug. Ich kümmere mich am Montag um die Behebung und melde mich wieder bei dir (bin im Moment unterwegs).
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 931
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dave » 04.10.2015, 12:57:34

Merkwürdig, bei mir funktioniert das Ausloggen im APF 3.0.1

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dr.e. » 05.10.2015, 22:25:07

Hallo zusammen,

ich habe eine Weile gebraucht bis ich das Problem nachvollziehen konnte. Zuerst ist es mir auch wie dave gegangen, dann habe ich einen alten Safari 5.1.7 ausgegraben und mit dem konnte ich das Phenomen tatsächlich nachvollziehen.

Problem scheint, dass der Browser bei einer HTTP 303 Antwort ein

Code: Alles auswählen

Set-Cookie:umgt-auth-token=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
nicht richtig interpretiert und beim anschließenden Aufruf des Ziels ein

Code: Alles auswählen

Cookie umgt-auth-token=47a298702e9ec4cf32d0efabc1db5a96
wieder mit sendet. Damit loggt dich die Applikation aus und gleich wieder ein. :roll:

Ferner wird in Chrome auf Grund von http://stackoverflow.com/questions/1134 ... cit-domain das umgt-auth-token-Cookie lokal nicht gesetzt. Zum Test habe ich den Code des APF\modules\usermanagement\pres\documentcontroller\login\LoginController manipuliert und die Cookie-Domain auf einen leeren String gesetzt. Dadurch wird das Cookie angenommen und das Login/Logout funktioniert fehlerfrei.

Ändere ich den Redirect zu einem HTTP 307 bzw. HTTP 308, so scheint auch Safari das Cookie zu löschen - allerdings nur scheinbar, denn es wird dann mit dem Wert "deleted" gefüllt und beim erneuten Request so an den Server übergeben. Da der Token natürlich so nicht existiert findet auch kein (Re-)Login mehr statt. Alles in Allem eine sehr komische Geschichte.

Ich fürchte ich kann dir keine schnelle Lösung anbieten. Magst du mal bei dir ausprobieren ob folgendes hilft (basierend auf 3.0.1):

APF\modules\usermanagement\pres\documentcontroller\login\LoginController:160

Code: Alles auswählen

$cookie = new Cookie(UmgtAutoLoginAction::AUTO_LOGIN_COOKIE_NAME, time() + $cookieLifeTime, ''); 
APF\modules\usermanagement\biz\login\UmgtLogoutAction:55

Code: Alles auswählen

self::getResponse()->redirect(LinkGenerator::generateUrl(Url::fromString($urlProvider->getRedirectUrl()))); 
Einfach die genannten Zeilen mit dem geposteten Code ersetzen.

Um das weiter einzugrenzen wäre interessant, welche PHP-Version du nutzt und wie deine lokale Domäne heißt (speziell wegen der Annahme der Cookies; siehe Stackoverflow-Link).
Viele Grüße,
Christian

GeneralCrime
Beiträge: 89
Registriert: 14.12.2011, 07:13:16
Kontaktdaten:

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von GeneralCrime » 06.10.2015, 12:38:42

Habe die Daten geändert ohne erfolg

Domain: 127.0.0.1
PHP: 5.6.11 local und 5.4.* im netz darum läuft da auch noch das 2.1 APF da ich mich nicht ran traue eine neue version zu kompellieren.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dr.e. » 06.10.2015, 18:28:57

Hi,

kannst du mal in deine hosts-Datei einen CNAME für 127.0.0.1 eintragen und deinen Apachen darauf konfigurieren? Das hatte bei mir auf jeden Fall vor ein paar Jahren geholfen lokal das Cookie-Thema zum laufen zu bringen (siehe Link oben). Wichtig ist, dass die Domain/der CNAME mindestens einen Punkt hat (z.B. dev.local).

Sollte das nichts helfen, schau dir mal die Netzwerk-Traces an ob das Cookie mit dem ersten Request (=Action-Aufruf) auch als gelöscht vom Server markiert wird und wie sich dein Browser beim zweiten Request verhält. Im Safari hatte ich wie oben beschrieben, dass der Browser das Löschen des Cookies gar nicht versteht/annimmt und beim zweiten Request das bisherige Cookie wieder mit sendet. Vielleicht kommen wir damit in die Nähe des Problems...
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 931
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dave » 28.02.2018, 11:24:49

Hallo zusammen,
ich greife das alte Thema mal wieder auf, da ich im Moment auch auf das gleiche Problem stosse.

Vorneweg: Ich nutze den aktuellen APF master-branch zur Entwicklung meiner neuen Applikation. Das entspricht also dem APF3.4
Zusätzlich: Ich nutze SSL und habe das URL-Rewriting aktiviert :)

Nun aber eins nach dem anderen:
Ich logge mich via InternetExplorer über das UMGT ein, aktiviere den Auto-Login und erhalte mein Cookie: (alle Angaben via Internet Explorer)

Code: Alles auswählen

Schlüssel:	umgt-auth-token
Wert:		5d3bf9ef3ce86a07c5cxxxxxxxx
Gültig bis:	Fri, 30-Mar-2018 08:55:15 GMT
Domäne:		robspreis.de
Pfad:		/
Sicher:		Nein
Nur HTTPS:	Nein
Ich logge mich via Firefox ein, mit Auto-Login und erhalte folgendes Cookie: (via Firefox)

Code: Alles auswählen

Name:		umgt-auth-token
Domain:		.robspreis.de
Pfad:		/
Läuft ab:	Fri, 30 Mar 2018 09:01:09 GMT
Zuletzt zugegriffen:	Wed, 28 Feb 2018 09:01:09 GMT
Wert:		8874c1685c540cxxxxxxxxxxxxx
HttpOnly:		false
Was mir als Unterschied direkt auffällt, ist der . (Punkt) in der Domäne und ich frage mich, warum das so nur beim Firefox explizit herausgestellt wird.

Soweit, so gut, nun logge ich mich wieder aus. Die UMGT-Logout-Action wird durchlaufen und anschliessend lande ich auf meiner durch den Redirect-Provider definierten Seite. Es passiert folgendes mit dem Cookie:
Der Browser sendet das Cookie.
Empfangen wird dann folgendes Cookie:

Code: Alles auswählen

Schlüssel:	umgt-auth-token
Wert:		deleted
Gültig bis:	Thu, 01-Jan-1970 00:00:01 GMT
Domäne:
Pfad:	
Sicher:		Nein
Nur HTTPS:	Nein
Domäne und Pfad ist leer (null). Screenshot:
keks.PNG
keks.PNG (5.48 KiB) 585 mal betrachtet
2. Request, als ich auf der Seite nach der Weiterleitung lande:

Code: Alles auswählen

Schlüssel:	umgt-auth-token
Wert:		5d3bf9ef3ce86a07c5cxxxxxxxx
Gültig bis:
Domäne:
Pfad:	
Sicher:
Nur HTTPS:
Es gibt nur noch das Cookie mit Namen und Wert, alles andere fehlt. Es wird also ein Teil des Cookie gelöscht, aber leider nicht das wesentliche :roll:
Im Firefox und Chrome gleiches Verhalten.

Ich habe zum Test den AutoLogin in meiner Bootstrap deaktiviert. Aber dadurch wird das Cookie auch nicht entfernt.

[EDIT]
Nachdem ich ein wenig recherchiert habe, habe ich die Klasse Cookie bei mir lokal angepasst.
Die Methode delete habe ich dahingehend geändert, sodass das Cookie mit einem leeren Wert ('') überschrieben wird. Dadurch wird es ebenfalls als "deleted" markiert und ist im Anschluss nach der Weiterleitung zum Ziel durch die Logout-Action auch wirklich entfernt und ich bin ausgeloggt. Und das funktioniert auch in allen Browsern.
Meine Quelle: https://stackoverflow.com/questions/285 ... wont-unset

Code: Alles auswählen

public function delete() {
      
	$cookieClone = clone $this;
	$cookieClone->setValue('');

	return $cookieClone;
}
Wo nun genau der Unterschied zwischen "als gelöscht markieren" und "löschen durch überschrieben mit leerem Wert" weiss ich nicht, bin leider kein Crack :?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dr.e. » 03.03.2018, 14:32:07

Hallo dave,

das Thema ist tatsächlich etwas komplexer, das Löschen auf einer impliziten Logik des Browsers basiert.

An sich wird das Löschen des Cookies in der Klasse ResponseImpl mit folgendem Quelltext vorgenommen:

Code: Alles auswählen

foreach ($this->cookies as $cookie) {
   if ($cookie->isDeleted()) {
      setcookie($cookie->getName(), false, time() - Cookie::DEFAULT_EXPIRATION_TIME);
   } else {
      setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpireTime(), $cookie->getPath(),
            $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
   }
}
Hier wird an sich die Anforderung
If the value argument is an empty string, or FALSE, and all other arguments match a previous call to setcookie, then the cookie with the specified name will be deleted from the remote client.

(siehe PHP.net und dein StackOverflow-Artikel) damit korrekt erfüllt. Einziger Unterschied ist vermutlich false vs. empty string.

Da ich das bei mir leider nicht nachvollziehen kann: funktioniert es bei dir, wenn du die oben geposteten Zeilen wie folgt abänderst und die Änderung der Klasse Cookie revertest?

Code: Alles auswählen

foreach ($this->cookies as $cookie) {
   if ($cookie->isDeleted()) {
      setcookie($cookie->getName(), '', time() - Cookie::DEFAULT_EXPIRATION_TIME);
   } else {
      setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpireTime(), $cookie->getPath(),
            $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
   }
}
Vielen Dank für deine Rückmeldung!
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4605
Registriert: 04.11.2007, 16:13:53

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dr.e. » 03.03.2018, 14:33:20

Nachtrag:
Wahlweise (Thema: Cookie Header muss identisch sein, nur Wert leer) könnte auch folgendes die Lösung sein:

Code: Alles auswählen

foreach ($this->cookies as $cookie) {
   if ($cookie->isDeleted()) {
      setcookie($cookie->getName(), '', time() - Cookie::DEFAULT_EXPIRATION_TIME, $cookie->getPath(),
            $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
   } else {
      setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpireTime(), $cookie->getPath(),
            $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
   }
}
Damit ist sichergestellt, dass Pfad, Domain und die HTTP-Attribute wirklich völlig identisch sind.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 931
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dave » 03.03.2018, 15:25:07

dr.e. hat geschrieben:
03.03.2018, 14:33:20
Nachtrag:
Wahlweise (Thema: Cookie Header muss identisch sein, nur Wert leer) könnte auch folgendes die Lösung sein:

Code: Alles auswählen

foreach ($this->cookies as $cookie) {
   if ($cookie->isDeleted()) {
      setcookie($cookie->getName(), '', time() - Cookie::DEFAULT_EXPIRATION_TIME, $cookie->getPath(),
            $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
   } else {
      setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpireTime(), $cookie->getPath(),
            $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
   }
}
Damit ist sichergestellt, dass Pfad, Domain und die HTTP-Attribute wirklich völlig identisch sind.
Funktioniert
Danke für deine Bemühungen, top, wie immer :)

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast