Ako na odoslanie zabudnutého hesla

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

Zdravím ľudia poradil by mi niekto z Vás ako na zabnuté heslo ktoré by bolo odoslané na email užívateľovi:

Zatiaľ to mám takto
SignPresenter

protected function createComponentSignResetForm() {
		$sign_RESET_form = new Form;
		$sign_RESET_form->addProtection();
		$sign_RESET_form->addText('username')
						->setAttribute('placeholder', 'Užívateľské meno')
						->setAttribute('class', 'form-control');
		$sign_RESET_form->addText('email')
						->setAttribute('placeholder', 'Emailová adresa')
						->setAttribute('class', 'form-control');
		$sign_RESET_form->addSubmit('signReset', 'Obnoviť heslo');
		$sign_RESET_form->onSuccess[] = $this->signResetSuccessSubmitted;
		return $sign_RESET_form;
	}

public function signResetSuccessSubmitted(Form $sign_RESET_form) {
		if (Čo sem dať aby to porovnalo či je platný email a username?) {
			$template = new FileTemplate(__DIR__ . '/../templates/Reset/resetpass.latte');
			$template->registerFilter(new Engine);
            $template->registerHelperLoader('\Nette\Templating\Helpers::loader');

            $mail = new Message;
            $mail->setFrom('VistmoLabs <vistmolabs@vistmolabs.org>')
                 ->addTo($sign_RESET_form['email'])
                 ->setSubject('Zabudnuté heslo')
                 ->setHtmlBody($template);

            $mailer = new SmtpMailer(array(
		        'host' => 'NEJAKY HOST',
		        'port' => 465,
		        'username' => 'NEJAKY JMENO',
		        'password' => 'HESLA SE NA FÓRA NEKOPÍRUJÍ!!!',
		        'secure' => 'ssl',
			));
        	$mailer->send($mail);
		} else {
			echo "Neplatné užívateľskémeno alebo emailová adresa";
		}
	}

a resetpass.latte

{block signtitle}{/block}

{block signcontent}
<span>Vyžiadali ste si heslo z formulára <strong>"Zabudo som Heslo"</strong></span>
<p>
 Užívateľské meno: {ako sem zadať username}
 Emailová adresa: {ako sem zadať email}
 Vaše heslo: {ako sem zadať heslo}
</p>
{/block}

Za všetky radi vopred Ďakujem.

matto
Člen | 55
+
+1
-

tieto udaje si vytiahnes z databazy a v prezentery ich len predas sablone takto:

$template->name = $name

A v sablone vypises

Užívateľské meno: {$name}

Druha vec:
Hesla by si nemal ukladat ako plain text, ale zahashovane s pouzitim funkcie crypt(), takze ich nebudes moct poslat uzivatelovi ale namiesto toho mu ponuknes moznost aby si vytvoril nove heslo.

Tretia vec:
„Čo sem dať aby to porovnalo či je platný email a username?“
Validacia sa riesi v tovarnicke formularu: https://doc.nette.org/cs/forms#…

Editoval matto (21. 6. 2014 15:36)

SontoEremo
Člen | 341
+
0
-

@matto
Ok hesla ukladám klasický cez UserManager zo Sandboxu

takže navrhuješ ak užívateľ zabudne svoje heslo nemám mu ho preposielať ale mám spraviť formulár na nové heslo?

matto
Člen | 55
+
+1
-

Ano, ty mu ho nemas ako poslat, v databaze je ulozene v takomto tvare: „$2y$10$3Ab82fkCSWANVh8MN/BEkuEnL/ZfRaU5DEgAZh/we9eD9/igUa5cW“ a z toho citatelne heslo uz nedostanes

MartinitCZ
Člen | 580
+
+3
-

@SontoEremo Posílat hesla emailem je security hell. Na email pošli link s hashem, který bude odkazovat na formulář pro změnu hesla.

SontoEremo
Člen | 341
+
0
-

**@martinit & @matto **
Ďakujem ale aj tak ako na to? myslím všetko to okolo toho
overiť username a email ak pasuje zaslať hash na email a po kliknutí zobraziť formulár so zmenou hesla?

MartinitCZ
Člen | 580
+
0
-

Zkoušej a uč se. Stylem „udělejte to za mě“ se nikam neposuneš. Toto bohužel není prvně.

Editoval martinit (21. 6. 2014 18:41)

SontoEremo
Člen | 341
+
0
-

**@martinit **
Ja samozrejme nežiadam aby si to niekto za mňa odmakal tak sa nenaučím ale mal som na mysli nejaké popostrčenie. Myslím si, že toto fúrom je na pomoc začiatočníkom predsa pracovať s Frameworkom a samotným php je trocha iná káva

Oli
Člen | 1215
+
+1
-

@SontoEremo pokud zapomněl, nech uživatele zadat email, kam mu přijde mail. Pokud takovej mail mas v db odešli mail s casove omezeným hashem. Po kliknuti na odkaz se dostane na stránku, kde 2× žádá heslo a rovnou ho přihlásíš.

SontoEremo
Člen | 341
+
-1
-

Toto asi nie je správne keďže mi to nefunguje

protected function createComponentSignResetForm() {
		$sign_RESET_form = new Form;
		$sign_RESET_form->addProtection();
		$sign_RESET_form->addText('username')
						->setAttribute('placeholder', 'Užívateľské meno')
						->setAttribute('class', 'form-control');
		$sign_RESET_form->addText('email')
						->setAttribute('placeholder', 'Emailová adresa')
						->setAttribute('class', 'form-control');
		$sign_RESET_form->addSubmit('signReset', 'Obnoviť heslo');
		$sign_RESET_form->onSuccess[] = $this->signResetSuccessSubmitted;
		return $sign_RESET_form;
	}

	public function signResetSuccessSubmitted(Form $sign_RESET_form) {
		$values = $sign_RESET_form->getValues();
		$sample = array($this->userRepository->userexists('username'), $this->userRepository->usermailexists('email'))
		if($values === $sample) {
			echo "OK";
		} else {
			echo "BAD";
		}
	}

Neviem ako overiť či je email a username vyplnení a či je správny či sedí email s username

Oli
Člen | 1215
+
0
-

@SontoEremo:

  1. addProtection je tady zbytečné si myslím. Jediné co by mohl útočník udělat, že pošle mail na reset hesla na mail „obeti“.
  2. Nedával bych tam to jméno. Já třeba mám několik jmen (podle toho jestli jsou jeste volny nebo ne) a zkouset jakej ze to mam mail a jmeno je vzdycky vopruz. Zkusim nejaky 4 varianty a pak bud zalozim novej ucet nebo se na tu stranku proste neloguju.
  3. po odeslání by jsi měl mít něco jako
$fromDb = $this->userRepository->getByMail($values->email);

if ($fromDb)
{
	// Uživatelem zadaný email je v db, pošleš mu mail.
} else
{
	// Uživatel není v db, ukážeš addError, flashMessage, ze vložený mail není v db
}

public function getByMail($mail)
{
	return $context->table('users')->where('email', $mail)->fetch();
}