Autorizace WebAuth + přesměrování na původní stránku

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

Ahoj, lámu si tu už celý den hlavu s problémem, který nedokážu vyřešit.

Přihlašování do naší webové aplikace probíhá přes WebAuth (modul pro apache, kde přístup do složky je chráněný heslem). Přihlášení funguje a na testovací aplikaci funguje i přesměrování na původní stránku. Mám to asi takhle:

  1. ve složce www je podsložka www/webauth, která je chráněná heslem
  2. SecurePresenter obsahuje kód, který do této složky přesměruje nepřihlášeného uživatele (+uloží backlink)
	function startup() {
		parent::startup();

		if(!$this->getUser()->isLoggedIn()) {
			$webauth_dir = $this->presenter->context->container->httpRequest->getUrl()->getBaseUrl() . "webauth";
			$url = "$webauth_dir?backlink=" . $this->storeRequest('+ 48 hour');
			$this->redirectUrl($url);
		}
	}
  1. po přesměrování je uživatel požádán o WebAuth login a po jeho správném zadání je do složky puštěn
  2. složka www/webauth obsahuje pouze index.php, který vrátí řízení zpět do Nette
// pouze přesměrujeme na WebauthPresenter
header('Location: ../../webauth/in?' . $_SERVER['QUERY_STRING']);
exit;
?>
  1. WebAuthPresenter::actionIn ověří uživatele a obnoví backlink (tj. přesměruje ho na původní odkaz)
public function actionIn($backlink, $clientres, $screenres) {
		if ($this->getUser()->isLoggedIn() == FALSE) {
			try {
				$login = isset($_SERVER["WEBAUTH_USER"]) ? $_SERVER["WEBAUTH_USER"] : $_SERVER["REDIRECT_WEBAUTH_USER"];

				$this->getUser()->setExpiration('+4 hours', TRUE);
				$this->getUser()->setAuthenticator($this->context->ldapAuthenticator);
				$this->getUser()->login($login);

				if (!empty($backlink))
					$this->getApplication()->restoreRequest($backlink);
			} catch (Nette\Security\AuthenticationException $e) {
				// v případě chyby přesměrujeme zpět na přihlašovací dialog
				$this->flashMessage($e->getMessage());
				return;
			}
		}
		$this->redirect('Homepage:');
	}

Takže to funguje stylem – zadám adresu www.nas-server.cz/admin, přesměruje mě na přihlášení poté zpět na AdminPresenter.

Do teď jsme celou aplikaci měli ve složce „test“ a fungovalo to přesně tak, jak si představujeme. Po přesunutí do kořene sice funguje přihlášení uživatele, ale už nefunguje přesměrování na původní odkaz. Kód, .htaccess atd. je všechno úplně stejné. Jenom došlo k tomu přesunutí o úroveň výše.

V laděnce vidím, že došlo ke špatnému přesměrování ze server/webauth do server/www/webauth (správně by mělo jít ze server/webauth do server/admin).

Nemá někdo ponětí, co by mohlo být špatně? Zjistil jsem, že $backlink se předá dobře, ale aktuální session už ho nezná, takže restoreRequest ho neobnoví. Čím to?

kolsi
Člen | 131
+
0
-

Ještě doplním čeho jsem si všimnul. Web běží na doméně třetího řádu, řekněme abc.def.cz. Jenže v době, kdy přesměrovávám do složky webauth dojde následně k tomu, že se před doménu ještě doplní www ⇒ www.abc.def.cz. A já pak vidím, že pro domény abc.def.cz a www.abc.def.cz mám různé session, takže je jasné, že nemůže dojít k obnovení backlinku.

Když máme aplikaci ve složce test, tak se www doplní také, ale daleko dříve (nejspíše už při směrování do složky test), takže to pak funguje.

Máme něco blbě?

Šaman
Člen | 2640
+
0
-

Od boku bych si střelil po .htaccessu. Případně přes něho řešit automatické přesměrování na preferovanou variantu. Myslím, že tohle Nette neřeší, to není věc frameworku. Resp. není to jeho věc, pokud to tam doplní/nedoplní prohlíčeč, nebo ten .htaccess. Svoje vlastní generované odkazy framefork řeší, konkrétně v routeru, ale to asi nebude tenhle případ.

Editoval Šaman (16. 4. 2015 19:32)

kolsi
Člen | 131
+
0
-

Ten náš .htaccess tedy asi nebude úplně dobře. Ten ve složce www máme stejný, co je v sandboxu Nette. Ale v kořeni máme vlastní, který vždy podstrčí složku www. Ta pak není v URL vidět.

RewriteEngine On
RewriteRule ^(.*)$ www/$1

Běžně to funguje dobře, ale po tom neúspěšném přesměrování, co jsem popsal výše, je URL ve tvaru http://www.abc.server.cz/www/

Otázka tedy je, kdo tam to www. doplní. Nejspíš to asi dělá ten webauth.

Šaman
Člen | 2640
+
0
-

Ten .htaccess z Nette neřeší přidání, nebo odstranění www ze začátku. To už si musíte vyřešit sami, ani není úplně jasné, která možnost (s, nebo bez) je lepší. Uživatelům by měly fungovat oboje, ale reálně volat by se měla jen jedna (protože SEO, session).

kolsi
Člen | 131
+
0
-

Jasný, chápu. .htaccess jsem upravil na

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteRule ^(.*)$ www/$1

Když teď zadám adresu do prohlížeče ručně, tak to správně ořezává a zobrazuje adresu bez www. Jenže jakmile se po ověření webauthem provede to přesměrování na WebAuthPresenter, tak se v adrese to www zase objeví (chová se to, jak kdyby v tu chvíli se ten htaccess zcela ignoroval).

Takže ještě nastává otázka, jak správně předat řízení zpátky do Nette (s tím, že potřebuju zaručit, že se mi předají i $_SERVER parametry, které nastaví ten WebAuth).

  • by mě možná i zajímalo, kdo může za to, že pro verzi s www a bez www se vytvoří různá session. Prohlížeč? Nette?

Editoval kolsi (23. 4. 2015 15:34)