Problem s authentikaci v IE7 a Safari

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
LeonardoCA
Člen | 296
+
0
-

Marne nejakou chvili badam nad chybou v autentikaci a uz me nenapada kde mam hledat.
Prihlaseni mi funguje bezchybne v FF, Google Chrome, Opere, IE6 testeru a nefunguje v IE7 a Safari – kdyz zadam spatne heslo, vyskoci chybova hlaska u formulare, ale pri spravnem hesle prihlaseni neprobehne a vyskoci opet prazdny formular.

nastaveni cookies v prohlizeci jsem kontroloval.

Prihlasovaci formular mam definovany jako komponentu.

Potreboval bych nakopnout :)

nize jsou podstatne kousky kodu

Default presenter

<?php
protected function createComponentUc($name)
  {
    	return new UniversalControl;
  }


	public function actionLogout()
	{
		Environment::getUser()->signOut();
		$this->redirect('Main:');
	}
?>

trida Users zajistujici autentikaci

<?php
class Users extends Object implements IAuthenticator
{

	public $connection;
	private $translator;

	const USER_EXISTS = 4;
	const EMAIL_CONFIRMATION = 5;

	public function __construct($translator = NULL)
	{
		$this->connection = dibi::getConnection('accounts_db');
		$this->translator = $translator;
	}

	public function authenticate(array $credentials)
	{
		$username = strtolower($credentials[self::USERNAME]);
		$password = $credentials[self::PASSWORD];

		$row = $this->connection->select('*')->from('USERS')->where('Email=%s', $username)->fetch();

		if (!$row) {
			throw new AuthenticationException("User not found", self::IDENTITY_NOT_FOUND);
		}

		if ($this->obscure($credentials[self::PASSWORD],$row->Psw) !== $row->Psw) {
			throw new AuthenticationException("Invalid password", self::INVALID_CREDENTIAL);
		}

		if ($row->Authorized == 0) {
			throw new AuthenticationException("Email confirmation needed", self::EMAIL_CONFIRMATION);
		}

		unset($row->Psw);
		$this->connection->query("UPDATE `USERS` SET `LoginCount` = LoginCount+1 WHERE UserID = ".$row->UserID);
		return new Identity($row->Email, NULL, $row);
	}
?>

trida UniversalControl – je komponenta vykreslovana default presenterem a v ni se jeji komponenta vykresluje prihlasovaci formular

<?php
class UniversalControl extends /*Nette\Application\*/Control
{

	public $translator;

  public function __construct($parent = NULL, $name = NULL)
  {
		parent::__construct($parent,$name);
		$this->translator = $parent->translator;
  }

	public function render()
	{
		$template = $this->template;
		$user = Environment::getUser();
Debug::dump($user->isAuthenticated());
		$template->user = $user->isAuthenticated() ? $user->getIdentity() : NULL;

		$template->setFile(dirname(__FILE__) . '/UniversalControl.phtml');
		$template->registerFilter(/*Nette\Templates\*/'CurlyBracketsFilter::invoke');

		$template->setTranslator($this->translator);
		$template->staticUri = Environment::getConfig('staticUri');
		$template->render();
	}

  protected function createComponentForm($name)
  {
        $form = new AppForm($this, $name);
        $form->addText('email', 'Email:',25)
        	->addRule(Form::FILLED, 'Enter your Email')
     		->addCondition(Form::FILLED)
        	->addRule(Form::EMAIL, 'E-mail is not valid');
	$form->addPassword('psw', 'Password:',25)
		->addRule(Form::FILLED, 'Enter your password');
	$form->addSubmit('ok', 'Login');
	$form->setTranslator($this->translator);
        $form->onSubmit[] = array($this, 'loginHandler');
  }

  public function loginHandler(AppForm $form)
  {
  if ($form->isSubmitted()) {
  	if ($form['ok']->isSubmittedBy() && $form->isValid()) {
  	  try {
		Environment::getUser()->authenticate($form['email']->getValue(), $form['psw']->getValue());
		$this->presenter->redirect('MoonBase:');
	  } catch (AuthenticationException $e) {
		$form->addError($this->translator->translate($e->getMessage()));
	  }
	}
 	}
 }

}
?>
phx
Člen | 651
+
0
-

Kapku nevidim definici konstant:

self::USERNAME
self::PASSWORD

Jinak bych se podival kde to v IE7 selze v metode loginHandler

LeonardoCA
Člen | 296
+
0
-

diky, mam update, selze to pri presmerovani po uspesnem prihlaseni ve funkci loginHandler, kdyz redirect zrusim, tak to funguje.

<?php
 $this->presenter->redirect('MoonBase:');
?>

netusim proc… ?

<?php
class MoonBasePresenter extends DefaultPresenter
{

	protected function startup()
	{
		parent::startup();
	  // check user authentication
		$user = Environment::getUser();
		if (!$user->isAuthenticated()) {
			if ($user->getSignOutReason() === User::INACTIVITY) {
				$this->flashMessage('You have been logged out due to inactivity. Please login again.');
			}
			if ($this->getPresenter()->getAction() != "login")
			{
	//			$this->redirect($this->getPresenter()->getName().':login');
			}
		}
	}
?>

Editoval LeonardoCA (21. 3. 2009 17:17)

phx
Člen | 651
+
0
-

Prijde mi to ze IE7 pri presmerovani ztrati session/cookies, ale proc?

Koukam, ze prihlasovaci form je v Controlu coz jsem osobne nezkousel, ale zkusil bych toto:

// misto
$this->presenter->redirect('MoonBase:');
// toto
$this->redirect('MoonBase:');
Panda
Člen | 569
+
0
-

phx napsal(a):

Kapku nevidim definici konstant:

self::USERNAME
self::PASSWORD

Konstanty self::USERNAME a self::PASSWORD „dědí“ třída Users od rozhraní IAuthenticator:

interface IAuthenticator
{
	/**#@+ Credential key */
	const USERNAME = 'username';
	const PASSWORD = 'password';
	/**#@-*/

	// ...

}
phx
Člen | 651
+
0
-

Aha jsem netusil ze rozhrani muze mit konstanty:)

Dopadlo to nejak s tim presmerovanim? Me obcas pomohlo kdyz jsem napriklad v Opere vypnum autmaticke presmerovani a hned jsem videl kam a jak a proc se mi to presmerovava (cykluje, atd).

LeonardoCA
Člen | 296
+
0
-

Tak se mi podarilo odhalit duvod. Odchytnul jsem si http hlavicky v me aplikaci a v akrabat, kde prihlaseni funguje. V http hlavicce mi chybi „Location“ – Safari a IE7 cookie bez teto polozky v http hlavicce neprijme.

Ted uz zbyva jen zjistit duvod, proc se mi Location v http headers neposila…

Editoval LeonardoCA (23. 3. 2009 17:42)

David Grudl
Nette Core | 8218
+
0
-

Zkus nepoužívat ?> na konci PHP skriptů.

LeonardoCA
Člen | 296
+
0
-

Vyřešeno. Moje blbost.

Abych mohl testovat současně pro .com a .cz doménu, nastavil jsem si na lokálu hostname serveru na

jmenodomeny_com
jmenodomeny_cz

v bootstrap.php jsem měl pro přiřazení správné sekce config.ini jak na živém, tak testovacím serveru

define('ENVIRONMENT', Str_Replace (".", "_", $_SERVER['HTTP_HOST']));

a neuvědomil jsem si, že podtržítko není pro hostname povolený znak – toť vše, stačilo, když jsem začal používat pomlčku, ale než jsem na to přišel…, nikde jinde než při akceptování session v IE7 a Safari se to neprojevilo