[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
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

[3.0] [Cookie] Cookie ExpireTime immer 1970

Beitrag von dave » 09.04.2015, 19:40:11

Bin beim Auto-Login vom Usermanagement hängen geblieben und musste dabei feststellen, dass das Cookie für den Auto-Login nicht richtig gesetzt wird.
Habe daraufhin einen Fehler in meiner Config gefunden und diesen behoben.

Das Cookie hat immer nur eine Lebensdauer bis 01-Jan-1970 00:00:01 GMT und wird somit sofort wieder gelöscht.

Habe nun mal versucht, über eine Testseite ein Cookie zu setzen: Das klappt allerdings gar nicht:

Code: Alles auswählen

$cookie = new Cookie(
         'foobar',
         time() + 2592000
      );
      $cookie->setValue('helloworld'); 
Im LoginController vom UMGT wird's anders gemacht:

Code: Alles auswählen

self::getResponse()->setCookie($cookie->setValue($token)); 
Wenn ich das nun so stumpf übernehme, ist das Cookie wieder nur bis 1970 gültig. Irgendwo passt etwas nicht. Sollte ich noch was entdecken, werde ich es passend ergänzen.

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

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

Beitrag von dr.e. » 10.04.2015, 14:24:04

Hallo dave,
Habe nun mal versucht, über eine Testseite ein Cookie zu setzen: Das klappt allerdings gar nicht:
Korrekt. Das Cookie muss im Response mitgegeben werden, sonst gelangt es erst garnicht nicht zum Client. Das hat mit der Änderung der Request-Verarbeitung (siehe http://adventure-php-framework.org/Seit ... on-Cookies). Insofern ist das Verhalten nachvollziehbar.
Wenn ich das nun so stumpf übernehme, ist das Cookie wieder nur bis 1970 gültig. Irgendwo passt etwas nicht. Sollte ich noch was entdecken, werde ich es passend ergänzen.
Das wiederum ist recht einfach zu erklären: :)

Das Cookie im LoginController wird per

Code: Alles auswählen

$cookie = new Cookie(UmgtAutoLoginAction::AUTO_LOGIN_COOKIE_NAME, time() + $cookieLifeTime);
konstruiert. Damit gibst du ihm ein entsprechende Lebenszeit mit. Habe mir die Konstruktion des Cookies nochmal angesehen und es ist in der Tat ungünstig, dass dort statt

Code: Alles auswählen

$this->expireTime = $expireTime;
ein

Code: Alles auswählen

$this->expireTime = time() + $expireTime;
steht. Mehr Flexibilität bietet das schon, allerdings hat das auch die Tücke, dass du dann ein Cookie nicht sauber setzt. Versuche mal deine Konstruktion identisch zu halten und den Konstruktor wie folgt zu ändern:

Code: Alles auswählen

public function __construct($name, $expireTime = null, $domain = null, $path = null, $secure = null, $httpOnly = null) {

   if (empty($name)) {
      throw new InvalidArgumentException('Cookie cannot be created with an empty name!');
   }

   $this->name = $name;
   $this->path = $path === null ? self::DEFAULT_PATH : $path;
   $this->domain = $domain === null ? $_SERVER['HTTP_HOST'] : $domain;
   $this->secure = $secure;
   $this->httpOnly = $httpOnly;

   if ($expireTime === null) {
      $this->expireTime = time() + self::DEFAULT_EXPIRATION_TIME;
   } else {
      $this->expireTime = $expireTime;
   }
}
Das halte ich für die beste Option um sowohl explizit einen Zeitstempel setzen zu können als sich auch auf den Standard von einem Tag verlassen zu können.

Danke für's Testen! :)
Viele Grüße,
Christian

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

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

Beitrag von dave » 10.04.2015, 18:24:29

Hallo Christian, danke für den Fix. Die Änderung soweit halte ich für sinnvoll, allerdings ändert das im Moment noch immer nichts an der Tatsache, dass mein umgt-auth-token-Cookie für den Permanent-Login nur eine Gültigkeit bis 1970 hat uns gelöscht wird.
Ich kann den Fehler absolut nicht nachvollziehen ...

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

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

Beitrag von dr.e. » 10.04.2015, 18:28:36

Hallo dave,
danke für den Fix.
OK, dann baue ich das noch ein.
Die Änderung soweit halte ich für sinnvoll, allerdings ändert das im Moment noch immer nichts an der Tatsache, dass mein umgt-auth-token-Cookie für den Permanent-Login nur eine Gültigkeit bis 1970 hat uns gelöscht wird.
Das ist in der Tat komisch. Selbst wenn nichts konfiguriert ist, sollte das Cookie 30 Tage Gültigkeit haben. Ich versuche das mal in der Sandbox nachzuvollziehen.

Melde mich wieder.
Viele Grüße,
Christian

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

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

Beitrag von dr.e. » 10.04.2015, 19:17:35

Problem erkannt und gelöst. Es hat sich ein Fehler in der Implementierung der Klasse Cookie eingeschlichen, der bisher komischerweise noch nicht aufgefallen ist. Änderung habe ich unter https://github.com/AdventurePHP/code/tree/release-3.0 eingecheckt. Aktuelle Sourcen kannst du dir unter https://github.com/AdventurePHP/code/ar ... se-3.0.zip herunter laden.

Freue mich über Feedback!
Viele Grüße,
Christian

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

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

Beitrag von dave » 10.04.2015, 21:00:36

Ok, sehr schön und wie immer herzlichen Dank fürs schnelle Lösen. Habs bei mir bereits getestet und es läuft wunderbar. Endlich kann ich Kekse futtern ;)
Werde mir nachher nochmal die Änderung durch den Kopf gehen lassen, in der Hoffnung es nachvollziehen zu können ;)

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

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

Beitrag von dr.e. » 10.04.2015, 22:13:50

Cool, freut mich! :) Wenn du Hilfe beim Nachvollziehen brauchst, sag Bescheid.
Viele Grüße,
Christian

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

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

Beitrag von dave » 11.04.2015, 18:23:32

Hi Christian, kleines Update:
Das Setzen des Cookies klappt nun mit richtigem Gültigkeitszeitraum.
Allerdings klappt es nun nicht mehr, das Cookie auszulesen.

In der UmgtAutoLoginAction liefert

Code: Alles auswählen

$cookie = new Cookie(self::AUTO_LOGIN_COOKIE_NAME, time() + $cookieLifeTime);
$authToken = $cookie->getValue();
immer NULL zurück.

Wenn ich nun in der Cookie-Klasse die Methode getValue wieder auf den Ursprung ändere:

Code: Alles auswählen

return isset($_COOKIE[$this->name]) ? $_COOKIE[$this->name] : $default;
klappts mit dem Auslesen des Cookies. Bei nem richtigen Logout und nem anschliessenden Login mit Auto-Login wird jedoch das Cookie wieder nur bis 1970 gesetzt ;)


Habe ein paar Versuche gestartet und schlage für die Methode getValue folgende Änderung vor:

Code: Alles auswählen

if($this->value !== null) {
   return $this->value;
} elseif(isset($_COOKIE[$this->name])) {
   return $_COOKIE[$this->name];
} else {
   return $default;
}
Damit wird das Cookie richtig gesetzt und später auch richtig gelesen.

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

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

Beitrag von dr.e. » 12.04.2015, 21:07:39

Hallo dave,

das hatte ich in der Tat übersehen. Allerdings ist ie Implementierung von Cookie absolut korrekt, UmgtAutoLoginAction nutzt noch das alte Nutzungsschema aus 2.X. Statt

Code: Alles auswählen

$cookie = new Cookie(self::AUTO_LOGIN_COOKIE_NAME, time() + $cookieLifeTime); 
muss es

Code: Alles auswählen

$cookie = self::getRequest()->getCookie(self::AUTO_LOGIN_COOKIE_NAME); 
heißen, dann wird der Wert auch sauber gesetzt. Versuche mal die run()-Methode durch folgende Zeilen austauschen:

Code: Alles auswählen

public function run() {

   /* @var $sessionStore UmgtUserSessionStore */
   $sessionStore = &$this->getServiceObject('APF\modules\usermanagement\biz\UmgtUserSessionStore', APFService::SERVICE_TYPE_SESSION_SINGLETON);

   $appIdent = $this->getContext();
   $user = $sessionStore->getUser($appIdent);

   // try to log-in user from cookie
   if ($user === null) {

      /* @var $umgt UmgtManager */
      $umgt = &$this->getDIServiceObject('APF\modules\usermanagement\biz', 'UmgtManager');

      $cookieLifeTime = $umgt->getAutoLoginCookieLifeTime();
      $cookie = self::getRequest()->getCookie(self::AUTO_LOGIN_COOKIE_NAME);
      $authToken = $cookie->getValue();

      if ($authToken !== null) {
         $savedToken = $umgt->loadAuthTokenByTokenString($authToken);

         if ($savedToken !== null) {

            $user = $umgt->loadUserByAuthToken($savedToken);

            if ($user !== null) {
               $sessionStore->setUser($appIdent, $user);
               $cookie->setExpireTime(time() + $cookieLifeTime);
               self::getResponse()->setCookie($cookie->setValue($savedToken->getToken()));
            }
         }
      }
   }
} 
Dann sollte alles korrekt funktionieren.
Viele Grüße,
Christian

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

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

Beitrag von dave » 13.04.2015, 18:49:50

Ok,
habe mein Cookie wieder auf Ursprung gebracht und die UmgtAutoLoginAction aktualisiert. Der Login funktioniert, alles wunderbar! :)
Sollte mir noch was auffallen, werde ich es hier posten ;)

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

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

Beitrag von dave » 14.04.2015, 00:58:26

Da ist dann leider doch noch etwas :?

Habe gerade mal die Seite von einem Rechner aus besucht, bei dem ich nicht eingeloggt bin und kein Cookie etc. existiert:
Fatal error: Call to a member function getValue() on a non-object in .../APF/modules/usermanagement/biz/login/UmgtAutoLoginAction.php on line 76
Ich poste das auch erstmal nur so rein, habe leider erst morgen Nachmittag wieder die Möglichkeit, da genauer zu schauen. Falls du in der Zwischenzeit schon was entdeckst, immer her damit ;)

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

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

Beitrag von dr.e. » 14.04.2015, 10:15:45

Hallo dave,

danke für's Testen! Problem war, dass die Methode getCookie() den Wert null liefert, sofern das Cookie nicht vorhanden ist. Habe eine Abfrage eingebaut um diesen Fall zu verhindern. Kannst du mal mit den aktuellen Quellen unter https://github.com/AdventurePHP/code/ar ... se-3.0.zip testen? Nun sollten alle Fälle abgedeckt sein.

Habe den Code auch noch nach ähnlichen Problemen durchsucht und es sind keine weiteren vorhanden.
Viele Grüße,
Christian

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

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

Beitrag von dave » 14.04.2015, 17:19:53

Überprüfen via hasCookie klappt, keine Probleme mehr. Dieses Thema können wir als erfolgreich beendet sehen :)

Da du nun jedoch schon die Methode getServiceObject() erweitert hast, fliegen mir beim Verwenden vom UMGT noch einige Exceptions um die Ohren (wie du siehst verwende ich den aktuelle Code vom Release ;)):
Argument 2 passed to APF\core\pagecontroller\APFObject::getServiceObject() must be of the type array, string given, called in .../APF/modules/usermanagement/biz/login/UmgtAutoLoginAction.php on line 63 and defined
Wenn ich nun also den Aufruf in Zeile 63 von

Code: Alles auswählen

$sessionStore = &$this->getServiceObject('APF\modules\usermanagement\biz\UmgtUserSessionStore',
            APFService::SERVICE_TYPE_SESSION_SINGLETON);
auf

Code: Alles auswählen

$sessionStore = &$this->getServiceObject('APF\modules\usermanagement\biz\UmgtUserSessionStore', [],
            APFService::SERVICE_TYPE_SESSION_SINGLETON);
erweitere, klappt das auch. Ist das so korrekt? Dann würde ich das nämlich schonmal anpassen.

Welchen Nutzen hat das Übergeben eines $arguments-Array für getServiceObject()?

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

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

Beitrag von dr.e. » 14.04.2015, 18:15:46

Hallo dave,

langsam kommen wir ans Ziel. :) :roll:
Ist das so korrekt? Dann würde ich das nämlich schonmal anpassen.
Das ist korrekt. Der zweite Parameter ist eine Liste von Konstruktor-Argumenten, die du übergeben kannst.
Welchen Nutzen hat das Übergeben eines $arguments-Array für getServiceObject()?
Der Vorteil ist, dass du Objekte nun nicht nur per Setter konfigurieren kannst, sondern Abhängigkeiten direkt im Konstruktor auflösbar sind. Um die Details dazu wird die Doku noch erweitert sobald RC2 verfügbar ist.

Lade dir nochmal ein ZIP herunter und prüfe mal, ob wir jetzt sauber sind. :)
Viele Grüße,
Christian

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

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

Beitrag von dave » 14.04.2015, 18:25:00

dr.e. hat geschrieben: Der Vorteil ist, dass du Objekte nun nicht nur per Setter konfigurieren kannst, sondern Abhängigkeiten direkt im Konstruktor auflösbar sind. Um die Details dazu wird die Doku noch erweitert sobald RC2 verfügbar ist.
Ok, dann warte ich mal noch die Doku ab und übernehme das erstmal einfach so.

Ausserdem: Grünes Licht, das UMGT läuft wieder rund. Einzig der HtmlHeader macht noch Probleme, aber die Umsetzung ist ja auch noch nicht vollständig abgeschlossen. Ich halte das Git-Repository im Auge ;)

Ausserdem 2: Herzlichen Dank für deine erstklassige Unterstützung. :geek:

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast