Overenie Tokenu zaslaného na email bez DB

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

Zdravím,
Mám SignPresenter na registráciu, prihlasovanie … a zaslanie zabudnutého hesla v ktorom riešim toto

/**
	* Reset factory.
	* @return Form
	*/
	protected function createComponentResetForm() {
		$resetForm = new Form;
		$resetForm->addProtection();
		$resetForm->addText('email')
				  ->setAttribute('placeholder', 'Emailová adresa')
				  ->setAttribute('class', 'form-control input-bg')
				  ->addRule(Form::EMAIL, 'Zadajte prosím, platnú emailovú adresu!');
		$resetForm->addSubmit('signReset', 'Obnoviť heslo');
		$resetForm->onSuccess[] = $this->resetFormSuccessSubmited;
		return $resetForm;
	}
	/**
	* @param Form $resetForm
	*/
	public function resetFormSuccessSubmited(Form $resetForm, $email) {
		$resValues = $resetForm->getValues();
		$email = $resValues->email;
		$resEmail = $this->userRepository->findByEmail($email);
		if(!$resEmail) {
			$resetForm->addError('Neplatná Emailová adresa');
		} else {
			$mailtoken = Utils\Random::generate(32);
            $template = new FileTemplate(__DIR__ . '/../templates/Email/reset.latte');
            $template->registerFilter(new Engine);
            $template->registerHelperLoader('\Nette\Templating\Helpers::loader');
            $template->verifymail = $this->presenter->link('//Sign:verifymail', array(
                'mailtoken' => $mailtoken,
            ));

            $resetmail = new Message;
            $resetmail->setFrom('PageName <email@email.xxx>')
                      ->addTo($resetForm['email']->value)
                      ->setSubject('Obnovenie Hesla')
                      ->setHtmlBody($template);

            $resetmailer = new SmtpMailer(array(
                'host' => 'smtp.email.xxx',
                'port' => 465,
                'username' => 'email@email.xxx',
                'password' => '****',
                'secure' => 'ssl',
            ));
            $resetmailer->send($resetmail);
            $this->presenter->flashMessage(Html::el('div')
                            ->setHtml('Na Vašu Emailovú adresu <strong class="email-strong"><br>' . $resetForm['email']->value . '<br></strong> bol zaslaný odkaz na nové heslo.'));
            $this->presenter->redirect('mailfinish');
		}
	}

Zaslal som si token ktorý v poriadku prišiel na email ale teraz sa snažím overiť či je token správny ak áno presmeruj ak nie vyhoď chybu ale neviem ako na to

public function renderVerifymail($mailtoken) {
		if(!$mailtoken) {
			echo "Chyba zlý token!";
		} else {
			echo "Všetko je OK!";
		}
		//dump($mailtoken);
	}

Ak dá správny token vyhodí Všetko je OK ak dám zlý vyhodí tiež Všetko je OK :) absolutne neviem ako overiť token bez DB

Editoval SontoEremo (20. 7. 2014 12:18)

Aurielle
Člen | 1281
+
0
-

Vycenzuruj si své heslo k e-mailu…

SontoEremo
Člen | 341
+
0
-

Aurielle napsal(a):

Vycenzuruj si své heslo k e-mailu…

Sakra zabudol som ďakujem za varovanie

David Matějka
Moderator | 6445
+
0
-

no $mailtoken si pri jeho vytvoreni (pri odesilani emailu) ulozis do databaze a pak se pri overovani kouknes, jestli existuje.

SontoEremo
Člen | 341
+
0
-

matej21 napsal(a):

no $mailtoken si pri jeho vytvoreni (pri odesilani emailu) ulozis do databaze a pak se pri overovani kouknes, jestli existuje.

Takže či chcem alebo nie bez DB to nejde
a stačí v DB iba (id,email,token)?

wicked
Člen | 290
+
0
-

SontoEremo napsal(a):

matej21 napsal(a):

no $mailtoken si pri jeho vytvoreni (pri odesilani emailu) ulozis do databaze a pak se pri overovani kouknes, jestli existuje.

Takže či chcem alebo nie bez DB to nejde
a stačí v DB iba (id,email,token)?

Já mám token uložen v tabulce komplet s přihlašovacím udajeme user, je na Tobě odkud token budeš tahat.

petr.pavel
Člen | 535
+
+1
-

Asi ti je jasné, že někam si ten token uložit musíš, ne? Jak bys jinak poznal, jestli ten, který ti přijde v url, je správně?
Jestli si ho uložíš do db nebo (spolu s e-mailem a platností) do souboru nebo do sdílené paměti… to už je na tobě. Nejjednodušší je využít stejné úložiště, které používáš v $userRepository, ne?

Teoreticky by šlo ho uložit i do session, Nette se v dokumentaci prsí, že ji chrání :-)