Obnovenie hesla a porovnanie užívateľa s databázou

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

Zdravím …
Rád by som sa Vás opýtal ako riešite obnovu hesla…
Viem, že to má byť token s url zaslaný na email a keď ho užívateľ odklikne prsmeruje ho to na stránku s formulárom kde sa vytvorí nové heslo a následne sa DB aktualizuej atď… to viem.

Len chcem vedieť ako si overujete užívateľa či je v db uložený ako porovnávate či zadal správny username?

Ja používam na prihlásenie email ktorý je UNIQUE ale ani za boha neviem ako to porovnať čo píše užívateľ a či sedí email.

Môj UserManager

public function matchEmail($email) {
		return $this->database->table(self::TABLE_NAME)->select(self::COLUMN_ID)->where(self::COLUMN_EMAIL, $email)->fetch();
	}

a Môj ResetFormFactory

$form->onSuccess[] = function (Form $form, $email) use ($onSuccess) {
			$values = $form->getValues();
			$matchMail = $this->userManager->matchEmail($email);
			if ($values->email == $matchMail) {
					$form->addError('Tento Email Existuje');
					return;
			} else {
				$form->addError('Tento Email NeExistuje');
					return;
			}
			$onSuccess();
		};
		return $form;

No stále bez úspechu…

JZechy
Člen | 161
+
0
-

Protože v matchEmail si dle názvu konstanty vyselektuješ ID, které pak porovnáváš s emailem, což logicky nikdy není true.

SontoEremo
Člen | 341
+
0
-

JZechy napsal(a):

Protože v matchEmail si dle názvu konstanty vyselektuješ ID, které pak porovnáváš s emailem, což logicky nikdy není true.

Ale skúšal som to aj bez toho ID výsledok stále rovnaký

public function matchEmail($email) {
        return $this->database->table(self::TABLE_NAME)->where(self::COLUMN_EMAIL, $email)->fetch();
    }
David Matějka
Moderator | 6445
+
0
-

koukni se na tu promennou $email co v ni je za hodnotu..

SontoEremo
Člen | 341
+
0
-

David Matějka napsal(a):

koukni se na tu promennou $email co v ni je za hodnotu..

dumpol som to ale neviem prísť na to

Mysteria
Člen | 797
+
0
-

Neměl by jsi mít místo

if ($values->email == $matchMail) {

spíše

if ($matchMail !== FALSE && $values->email === $matchMail->email) {

? Protože ta metoda matchEmail ti vrací celej řádek databáze a s tím ty porovnáváš ten email z formuláře.

Editoval Mysteria (10. 1. 2017 10:58)

SontoEremo
Člen | 341
+
0
-

Mysteria napsal(a):

Neměl by jsi mít místo

if ($values->email == $matchMail) {

spíše

if ($matchMail !== FALSE && $values->email === $matchMail->email) {

? Protože ta metoda matchEmail ti vrací celej řádek databáze a s tím ty porovnáváš ten email z formuláře.

Ďakujem ale to môj problém stále nerieši viem že chyba je

public function matchEmail($email) {
        return $this->database->table(self::TABLE_NAME)->where(self::COLUMN_EMAIL, $email)->fetch();
    }

Tu ale kde to neviem.

David Matějka
Moderator | 6445
+
0
-

co je teda v $email?

SontoEremo
Člen | 341
+
-2
-

David Matějka napsal(a):

co je teda v $email?

Ak dám dump

public function matchEmail($email) {
		$test = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_EMAIL, $email)->fetch();
		dump($test);
	}

Vyhodí to len FALSE nič viac

Mysteria
Člen | 797
+
0
-

To znamená, že tam není žádný řádek s daným emailem. Dej dump($email), ať vidíš, co to je za email, jestli je správnej a podobně.

SontoEremo
Člen | 341
+
-1
-

Mysteria napsal(a):

To znamená, že tam není žádný řádek s daným emailem. Dej dump($email), ať vidíš, co to je za email, jestli je správnej a podobně.

Nette\Utils\ArrayHash #29b3
email => "moj-email@domena.xx" (24)

Aký email zadám taký mi dump vyhodí

Editoval SontoEremo (10. 1. 2017 11:45)

Mysteria
Člen | 797
+
0
-

Počkat, jestli to dobře chápu, tak když si uživatel zažádá o změnu hesla, tak on vyplní email, na který mu přijde URL adresa s nějakým tokenem. On klikne na tu URL a tam má zadat znova svůj email a nové heslo a pokud vyplnil správný email, tak mu to heslo změníš? Pokud sem to pochopil dobře a chceš aby to fungovalo takhle, tak to se mi zdá jako blbost, protože tam vlastně nikde nepracuješ s tím tokenem.

Řeknu ti, jak to řeším já. Mám klasicky tabulku user (id, username, password, email) a forgotten_password (id, user_id, timestamp, token). Uživatel klikne na odkaz, vyplní svůj email a pokud email existuje v tabulce user, tak do forgotten_password hodím nový řádek s odkazem na daného uživatele, vygenerovaným tokenem a aktuálním časem. Pošlu email, kde je odkaz, který obsahuje token. Zkontroluje se, zda je token platný (tzn. je v tabulce forgotten_password a není starší třeba než 2 hodiny). Pokud ano, tak zobrazím políčko na zadání nového hesla, on ho zadá a změním heslo uživateli, se kterým byl asociován ten token. Případně, kdyby jsi trval i na zadání emailu, tak to bude podobné. Platnost tokenu ověříš stejně, ale před samotnou změnou hesla si ještě zkontroluješ, jestli uživatel zadal email, který je stejný jako uživatele, který je asociován s tím tokenem.

SontoEremo
Člen | 341
+
0
-

@Mysteria

Počkat, jestli to dobře chápu, tak když si uživatel zažádá o změnu hesla, tak on vyplní email, na který mu přijde URL adresa s nějakým tokenem. On klikne na tu URL a tam má zadat znova svůj email a nové heslo a pokud vyplnil správný email, tak mu to heslo změníš? Pokud sem to pochopil dobře a chceš aby to fungovalo takhle, tak to se mi zdá jako blbost, protože tam vlastně nikde nepracuješ s tím tokenem.

Nie email zadá len pre overenie či je to ten užívateľ a či je v db jeho email. Pošlem mu email s tokenom.
Presmerujem ho cez odkaz v emaily na formulár s novým heslo kde si ho môže zmeniť.

Mám klasicky tabulku user (id, username, password, email) a forgotten_password (id, user_id, timestamp, token).

Tá tabuľka forgotten_password musí obsahovať FOREIGN KEY? teda ten user_id musí byť FOREIGN KEY?

David Matějka
Moderator | 6445
+
0
-

@SontoEremo ty to furt nevidis? v te promenne $email nemas retezec s tim emailem, ale objekt, jehoz jedna hodnota je email

SontoEremo
Člen | 341
+
0
-

David Matějka napsal(a):

@SontoEremo ty to furt nevidis? v te promenne $email nemas retezec s tim emailem, ale objekt, jehoz jedna hodnota je email

Prepáč ale fakt už neviem

SontoEremo
Člen | 341
+
0
-

Skúsil som to teda takto

public function matchEmail($email) {
		return $this->database->table(self::TABLE_NAME)
					 ->where(self::COLUMN_EMAIL, ['email' => $email])
					 ->fetch();
	}
if ($values->email == $matchMail->email) {
					$form->addError('Tento Email Existuje');
					return;
			} else {
				$form->addError('Tento Email NeExistuje');
					return;
			}
			$onSuccess();

A napodiv to overuje len či to je správne

David Matějka
Moderator | 6445
+
+2
-
$form->onSuccess[] = function (Form $form, $email) use ($onSuccess) {
            $values = $form->getValues();

ten $email – tam se ti nepreda email, ale hodnoty z formulare. tedy to, co je i v $form->getValues() na dalsim radku. k emailu se dostanes pres $values->email

SontoEremo
Člen | 341
+
-1
-

David Matějka napsal(a):

$form->onSuccess[] = function (Form $form, $email) use ($onSuccess) {
            $values = $form->getValues();

ten $email – tam se ti nepreda email, ale hodnoty z formulare. tedy to, co je i v $form->getValues() na dalsim radku. k emailu se dostanes pres $values->email

Prepáč ale teraz fakt nerozumiem veď tam ten values->email uvádzam

David Matějka
Moderator | 6445
+
+1
-
$form->onSuccess[] = function (Form $form, $values) use ($onSuccess) {
//ve $values je to stejne jako v $form->getValues()

uz nevim, jak to lepe rict…

SontoEremo
Člen | 341
+
0
-

David Matějka napsal(a):

$form->onSuccess[] = function (Form $form, $values) use ($onSuccess) {
//ve $values je to stejne jako v $form->getValues()

uz nevim, jak to lepe rict…

ale však som to tak aj mal

$form->onSuccess[] = function (Form $form, $email) use ($onSuccess) {
			$values = $form->getValues();
David Matějka
Moderator | 6445
+
0
-

ale tam se NEPREDAVA email, tak se predavaji objekt s hodnotami z formulare. Ten stejny objekt, jako ziskas pres $form->getValues(). Takze kdyz tento objekt pak posilas do metody matchEmail, ktera ocekava, ze tam bude retezec s emailem, tak to nemuze fungovat.

CZechBoY
Člen | 3608
+
0
-

@SontoEremo
Ráno moudřejší večera :-). Na tvým místě bych si dal pauzu aspoň do rána.

SontoEremo
Člen | 341
+
+1
-

@DavidMatějka
Ďakujem už som to pochopil :)

@CZechBoY :) stačila 2 hod. pauza :)