fregge: COOKIE login klappt nicht -.-

Hey

Folgende Methoden:
~~~php /**
* Der technische Login, setzt Cookie, Session, Datenbank
*/
private function _setLoginStatus($name,$id,$time,$model,$bids){
// Values
$values=array(
  'u_id'=>$id,
  'u_name'=>$name
);

	// Create Hash  
	$values['key']=sha1($values['u_id'].'|'.$values['u_name'].'|'.self::$cookiesalt);  
	  
	// Create Cookie-String  
	$string=implode('|',$values);  
	  
	# COOKIE // Save Cookie  
	if(setcookie('u',$string,time()+321408000)===false){  
		return false;  
	}  
	  
	  
	# MEM // Save Key to memcached  
	$userkey='u_'.$id.'_key';  
	if(!mem::get($userkey)){  
		mem::set($userkey,$values['key']);  
	}else{  
		mem::replace($userkey,$values['key']);  
	}  
	  
	return true;  

}
/**
* Checks if Cookie avaiable and not manipulated
*/
private function _checkCookie(){
#tools::ga($_COOKIE);exit();
if(isset($_COOKIE[self::$cookiename])){
$s=explode('|',$_COOKIE[self::$cookiename]);
// Cookie manipulated?
if(sha1($s[0].'|'.$s[1].'|'.self::$cookiesalt)===$s[2]){
return array($s[2],$s[0],$s[1]);
}else{
setcookie(self::$cookiename,'',time()-36000);
return array(false,$s[0]);
}
}

	return false;  
}  
  
/*  
* Authentifizieren  
*/  
public function Auth(){  
	if($keyIdName=$this->_checkCookie()){  
		if($keyIdName[0]===mem::get('u_'.$keyIdName[1].'_key')){	  
			self::$uname=$keyIdName[2];  
			self::$uid=$keyIdName[1];  
			self::$status=true;  
		}else{  
			self::$uname='';  
			self::$uid=0;  
			self::$status=false;  
			mem::delete('u_'.$keyIdName[1].'_key');  
		}  
	}
  
\_setLoginStatus wird von einer Methode namens "Login()" aufgerufen.  
Die Parameter werden alle richtig pbergeben und auch checkUsers() liefert das richtige Ergebnis zurück.  
Auch das Cookie wird gesetzt, nach dem setLoginStatus wird ein PHP-Redirect durchgeführt  
~~~php
header('Status: 301');  
		header('Location: /');  
		exit();

Danach ist der Cookie nicht mehr da - warum?

  1. moin,

    Danach ist der Cookie nicht mehr da - warum?

    Wie "nicht mehr da"? Hat der Browser den Cookie gespeichert oder nicht? Sendet der Browser den Cookie?

    1. im Browser nachschauen
    2. prüfe den Parameter path

    Hotti

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Wie "nicht mehr da"? Hat der Browser den Cookie gespeichert oder nicht? Sendet der Browser den Cookie?

      Ja er wird gespeichert, er existiert nach der Weiterleitung auch noch. Erst wenn der Dispatcher das nächste mal user_call_function aufruft, verschwindet das Cookie. Einfach weg.

      1. Hi!

        Wie "nicht mehr da"? Hat der Browser den Cookie gespeichert oder nicht? Sendet der Browser den Cookie?
        Ja er wird gespeichert, er existiert nach der Weiterleitung auch noch. Erst wenn der Dispatcher das nächste mal user_call_function aufruft, verschwindet das Cookie. Einfach weg.

        Bitte beobachte und beschreibe genauer. Wie stellst du fest, dass der Keks da ist beziehungsweise nicht mehr da ist? Welcher HTTP-Verkehr ist in der Zwischenzeit zwischen Server und Browser gelaufen, wobei die cookie-relevanten Teile interessieren (Set-Cookie)?

        Du berücksichtigst auch, dass Cookies immer erst einen Request nach dem setcookie() in $_COOKIE zur Verfügung stehen?

        Lo!

        1. Hi.

          Bitte beobachte und beschreibe genauer. Wie stellst du fest, dass der Keks da ist beziehungsweise nicht mehr da ist? Welcher HTTP-Verkehr ist in der Zwischenzeit zwischen Server und Browser gelaufen, wobei die cookie-relevanten Teile interessieren (Set-Cookie)?

          Es geht um das Cookie mit dem Namen "u".
          Hier! Da sieht man es, es wird gesetzt:

          HTTP/1.1 302 Found
          Date: Fri, 09 Jul 2010 10:07:17 GMT
          Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1
          X-Powered-By: PHP/5.3.1
          Accept-Charset: utf-8;q=0.7,*;q=0.7
          Expires: Thu, 19 Nov 1981 08:52:00 GMT
          Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
          Pragma: no-cache
          Set-Cookie: user[lang]=de; expires=Sun, 08-Sep-2013 19:53:56 GMT
          Set-Cookie: u=4%7Ctest%7Cd80a27aa8740b0f9570e8c0cde223ed761219d46; expires=Mon, 14-Sep-2020 10:07:17 GMT
          Status: 301
          Location: http://winila/
          Content-Length: 0
          Keep-Alive: timeout=5, max=100
          Connection: Keep-Alive
          Content-Type: text/html; charset=utf-8
          ----------------------------------------------------------
          http://winila/

          GET / HTTP/1.1
          Host: winila
          User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 GTB7.1
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
          Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
          Accept-Encoding: gzip,deflate
          Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
          Keep-Alive: 115
          Connection: keep-alive
          Referer: http://winila/
          Cookie: user[lang]=de; USERAUTH=91fc005f257a777860689b111fa5a17c; PHPSESSID=m9hkpsa4ohma2i19feo6ljip01

          Du berücksichtigst auch, dass Cookies immer erst einen Request nach dem setcookie() in $_COOKIE zur Verfügung stehen?

          Ja.

          Es ist einfach nicht mehr da...

          1. Moin!

            Es ist einfach nicht mehr da...

            Oft liegt an Verlinkungen mit absoluten Adressen.

            http://www.example.com/seite.php und example.com/seite.php sind, was Cookies betrifft, "nicht ganz" das selbe. Könnten ja verschiedene Server sein.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

            1. Nein die Verlinkung geht einfach nach / - also Root, wo auch das Login-Formular ist.

              1. Moin!

                Nein die Verlinkung geht einfach nach / - also Root, wo auch das Login-Formular ist.

                MFFG (Mit freundlich- friedfertigem Grinsen)

                Schmeiß spaßeshalber mal den Status 301 raus oder ersetze den durch 302.

                fastix

                1. Schmeiß spaßeshalber mal den Status 301 raus oder ersetze den durch 302.

                  Unverändert. Es bleibt immernoch nicht stehen und ich weiß echt nicht mehr weiter.

                  lg

          2. hi,

            HTTP/1.1 302 Found

            Das ist schonmal Müll, guck Dir an was geht in Sachen Status.

            Set-Cookie: u=4%7Ctest%7Cd80a27aa8740b0f9570e8c0cde223ed761219d46; expires=Mon, 14-Sep-2020 10:07:17 GMT

            Ja ok, wird der auch gespeichert?

            Cookie: user[lang]=de; USERAUTH=91fc005f257a777860689b111fa5a17c; PHPSESSID=m9hkpsa4ohma2i19feo6ljip01

            Dein Cookie Named "u" wird nicht gesendet. Prüfe die Parameter domain (danke fastix) und path.

            Hotti

            1. Alles klar, es lag an path. So ein Anfängerfehler. Wie dumm einfach. Danke Leute.

              1. Alles klar, es lag an path. So ein Anfängerfehler.

                Sag das nicht. Wenn Du wüsstest, was manchmal im Profibereich für Fehler gemacht werden ;-)

                Hottü

          3. Hi,

            Es geht um das Cookie mit dem Namen "u".
            Hier! Da sieht man es, es wird gesetzt:

            HTTP/1.1 302 Found
            [...]
            Set-Cookie: u=4%7Ctest%7Cd80a27aa8740b0f9570e8c0cde223ed761219d46; expires=Mon, 14-Sep-2020 10:07:17 GMT
            Status: 301

            Wenn hier dein selbst gesetzter Status-Header mit dem Wert 301 noch mal auftaucht, obwohl ganz oben HTTP/1.1 302 Found als der letztendlich verwendete Statuscode steht - dann sollte dir doch wohl hier auffallen, dass dein eigener Header irgendwie Murks war.

            Location: http://winila/

            Wo der herkommen soll, ist auch rätselhaft.
            In deinem Code hattest du den Wert "Location: /" verwendet, was übrigens definitiv falsch ist.

            Und wenn "winila" der Hostname ist, über den du testest - hast du bedacht/dich informiert, dass es bei solchen Hostnamen und Cookies insb. bei der Verwendung des IE immer wieder Probleme gibt?

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]