Problém s přihlášením. Localhost funguje, production ne

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

Ahojte,

mám problém s přihlašováním podle quickstartu. Vše jsem udělal tak jak jsem měl.
Na localhostu pak vše funguje jak má, ale po uploadu na produkční server(wedos) se přihlašování nepovede.

Proces se zasekne na podmínce, která je umístěna ve startupu v presenterech(kromě Base a Sign):

if (!$this->getUser()->isLoggedIn()) {
        $this->redirect('Sign:in');
    }

Pokud zadám špatné heslo/už. jméno, tak proces neprojde a vyhodí se hláška o špatných credentials. Ale pokud zadám správné hodnoty, form se odešle, neprojde podmínkou a vrátí se zpět na SignPresenter. Už opravdu nevím co s tím :(.

Děkuji.

Grelek
Člen | 233
+
0
-

Střela do prázdna – zkus smazat cache.

frenkiesoul
Člen | 11
+
0
-

Díky za odpověď. Smazat cache už jsem zkoušel, stejně tak jako cookies v browseru. Trápí mě hlavně to, že localhost jede naprosto v pořádku, takže mi asi uniká něco zřejmýho :/

enumag
Člen | 2118
+
0
-

Připadá mi to jako nějaký problém s ukládáním session.

n.u.r.v.
Člen | 485
+
0
-

Mě něco podobného dělá IE 10 na localhostu – když vložím špatné přihlašovací údaje, tak mi to ukáže chybu, takže komunikace s DBS a kontrola údajů funguje, ale jakmile vložím správné údaje, hodímě to zpět na přihlašovací formulář bez jakékoliv hlášky…

V Opeře, Firefoxu i Chrome to funguje bez problémů… Cache nette i IE jsem zkoušel vymazat – nepomohlo…

frenkiesoul
Člen | 11
+
0
-

Díky, přesně jak říkal enumag, jednalo se o chybu ukládání sessions.

n.u.r.v.
Člen | 485
+
0
-

A jak si to vyřešil? Já jsem si do debug baru dal info o session a při načtení stránky přihlašovacího formuláře se nějaká nette session vytvoří…ale pak už ne…

enumag
Člen | 2118
+
0
-

@frenkiesoul: Můžeš upřesnit kde přesně byl problém, aby se mohli ostatní poučit? Díky.

frenkiesoul
Člen | 11
+
0
-

Budu jen rád když někomu pomůžu.

Server mi hlásil chyby v sessions(nevšiml jsem si toho), podle toho co hlásil jsem vytvořil v rootu složku „session“. Tím se problém vyřešil.
Abych to po sobě uklidil, nastavil jsem potom pomocí metody setSavePath () znovu cestu a vše už funguje jak má :).

n.u.r.v.
Člen | 485
+
0
-

Hmm, tak mě to nejde na localhostu v IE – ostatní prohlížeče fungují 100%.

Co se stane:

  1. zobrazí se formulář pro přihlášení – v debugbaru jsou zobrazeny 3 session (2 si dělá nette a jednu dělám já v basepresenteru pro uložení ip a dalších info) – takže se session vytvoří
  2. odešlu dobře vyplněný formulář
  3. hodí mě to znovu na přihlašovací formulář a v debugbaru jsou ty původní session a „ikona dveří a Sign:in signInForm-submit!“

To je vše. Ani se to nedostane na kontrolu hesla a username, protože když dám chybné údaje, tak se chyba nevypíše – jako by neproběhla metoda pro zpracování formuláře…

A tento problém potřebuji vyřešit, protože dle google anaytics používá 70% mých návštěvníků IE…

Editoval n.u.r.v. (3. 7. 2013 15:19)

Grelek
Člen | 233
+
0
-

Neběží aplikace v IFrame? Tam jsem musel pro IE speciálně posílat nějakou hlavičku. Bylo to u Facebookových aplikací.

Editoval Grelek (3. 7. 2013 15:31)

n.u.r.v.
Člen | 485
+
0
-

To nevím → žádný iframe jsem nedělal – jedině že by to dělal nette…

Edit – dal jsem si v IE zobrazit kod a iframe v kodu není…

Editoval n.u.r.v. (3. 7. 2013 15:29)

Grelek
Člen | 233
+
0
-

Když to neděláš ručně, Nette určitě ne. Nette dokonce blokuje běh aplikace v IFrame – musíš to ručně povolit. I přes to, zkus tam dát tohle.

header('P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
enumag
Člen | 2118
+
0
-

@n.u.r.v.: Střela od boku, nepoužíváš omylem Nette\Forms\Form místo Nette\Application\UI\Form?

Editoval enumag (3. 7. 2013 15:37)

n.u.r.v.
Člen | 485
+
0
-

Grelek: ééé – kam to mám vložit? Díky

enumag:

ne, takto vypadá signpresenter:

<?php

use Nette\Application\UI\Form;
use Nette\Application\UI;
use Kdyby\BootstrapFormRenderer\BootstrapRenderer;

/**
 * Sign in presenter.
 */
class SignPresenter extends BasePresenter {

    /**
     * Sign-in form factory.
     * @return Nette\Application\UI\Form
     */
    private $logRepository;
    private $firmaRepository;
    private $log;

    public function __construct(\Todo\LogRepository $log) {
        $this->log = $log;
    }

    public function startup() {
        parent::startup();
        if ($this->getUser()->isLoggedIn()) {//pokud je uživatel přihlášen
            $this->redirect('Homepage:default');
        }
        $this->logRepository = $this->context->logRepository;
        $this->firmaRepository = $this->context->firmaRepository;
    }

    protected function createComponentSignInForm() {
        $form = new Form();
        $form->setRenderer(new BootstrapRenderer);
        $form->addProtection();
        $form->setMethod('POST');
        $form->addText('email', 'E-mail:')
                ->setRequired('Zadejte prosím Váš e-mail!')
                ->setAttribute('name', 'username')
                ->addRule(Form::EMAIL, "Vložený e-mail je ve špatném formátu!");
        $form->addPassword('password', 'Heslo:')
                ->setRequired('Vyplňte heslo')
                ->setAttribute('onkeyup', 'passwordStrength(this.value);')
                ->setAttribute('id', 'pass')
                ->setAttribute('name', 'password');
        $form->addSubmit('send', 'Přihlásit!');
        $form->onSuccess[] = $this->signInFormSubmitted;

        return $form; // vykreslí formulář
    }

    public function signInFormSubmitted(Form $form) {
        try {
            $user = $this->getUser();
            $values = $form->getValues();
            $user->login($values->email, $values->password);
            $user->setExpiration('+ 10 minutes', TRUE);
            $this->flashMessage('Přihlášení bylo úspěšné.', 'success');
            $firma = $this->firmaRepository->get_firma($user->getIdentity()->CF);
            $uzivatel = $this->getSession('uzivatel');
            $uzivatel->firma_nazev = $firma->NAZEV;
            $uzivatel->firma_adresa = $firma->ADRESA;
            $uzivatel->firma_obec = $firma->OBEC;
            $uzivatel->firma_ICO = $firma->ICO;
            $uzivatel->firma_DIC = $firma->DIC;
            $uzivatel->ip_adresa = $this->context->httpRequest->getRemoteAddress(); //ulozeni ip adresy do session
            $uzivatel->browser = $this->context->httpRequest->getHeader('user-agent');

            $this->log->zapis_log("1", $user->getIdentity()->CF, "0");
            $this->redirect('Homepage:');
        } catch (Nette\Security\AuthenticationException $e) {
            $form->addError($e->getMessage());
        }
    }

}

Editoval n.u.r.v. (3. 7. 2013 15:41)

Grelek
Člen | 233
+
0
-

Do základního presenteru celé aplikace do metody startup.

enumag
Člen | 2118
+
0
-

@n.u.r.v.: Problém to asi nevyřeší, ale určitě bys neměl přepisovat konstruktor presenteru, použij inject* metody nebo @inject anotace.

n.u.r.v.
Člen | 485
+
0
-

Ok, zkusím…

ještě něco – schválně jsem zkusil dát pryč „use Kdyby\BootstrapFormRenderer\BootstrapRenderer;“ a pak se mi po odeslání formuláře zobrazilo anglicky jako že mám odeslat formulář znovu, protože token neplatí. Když jsem dal pryč i „addProtection()“, tak se to vypisovalo taky…

EDIT: header nepomohl

Editoval n.u.r.v. (3. 7. 2013 15:54)

enumag
Člen | 2118
+
0
-

To je divný, při odstranění toho use bys měl dostat „class BootstrapRenderer not found“.

n.u.r.v.
Člen | 485
+
0
-

Jo, zapomněl jsem napsat, že jsem z formuláře odstranil i „$form->setRenderer(new BootstrapRenderer);“

n.u.r.v.
Člen | 485
+
0
-

Uf, teĎ jsem přijel domů a zkusil jsem to na domácím PC kde mám také IE10 a tam to funguje…takže problém je na mém pracovním notebooku s IE10…

enumag
Člen | 2118
+
0
-

Nemáš na tom notebooku čistě náhodou vypnutá cookies, že ne? :-D

n.u.r.v.
Člen | 485
+
0
-

zkusím zjistit – IE jsem nikdy nepoužíval/nenastavoval, takže je v default stavu

Edit: i když jsem nastavil v IE v záložce „zabezpečení“ hodnotu na nejnižší a v záložce „osobní údaje“ jsem dal „přijmout všechny cookie“, tak to nepomohlo…

Editoval n.u.r.v. (4. 7. 2013 9:45)

martin.knor
Člen | 17
+
0
-

Měl jsem stejný problém – řešení je v tom že IE nedokáže překousnout když má v názvu domény (nebo subdomény) podtržítko (_). Prostě nedokáže uložit cookies. Takže stačí z URL odebrat tento znak a mělo by to jet.

n.u.r.v.
Člen | 485
+
0
-

asi to bude ono – přejmenoval jsem to a od té doby to funguje…