SimpleIdentity špatné heslo HASH

mimacala
Člen | 113
+
0
-

Ahojte,
prosím začlo mi to házet error při přihlášení Invalid password, nedaří se mi dopracovat k tomu jestli to správně kontroluje heslo:),

    public function authenticate(string $email, string $password): SimpleIdentity
    {
        $row = $this->database->table('uzivatele')
            ->where('email', $email)
            ->fetch();

        if (!$row) {
            throw new Nette\Security\AuthenticationException('User not found.');
        }

        if (!$this->passwords->verify($password, $row->heslo)) {
            throw new Nette\Security\AuthenticationException('Invalid password.');
        }

        return new Nette\Security\SimpleIdentity($row->id, $row->role);
    }
}
    public function create(): Form
    {
        $form = new Form;
        $form->addEmail('email', 'Email:');
        $form->addPassword('heslo', 'Heslo:');
        $form->addSubmit('send', 'Přihlásit');
        $form->onSuccess[] = [$this, 'OnSucceeded'];
        return $form;
    }

    public function OnSucceeded(Form $form,$data): void
    {

        $identity = $this->kontrola->authenticate($data->email, $data->heslo);
        $this->user->login($identity);

    }
    }

Password verify nic nedělá vrací bool ale nikde hash neodkrývá, takže mi to moc nedává smysl.

function password_needs_rehash(string $hash, string|int|null $algo, array $options = []): bool {}

/**
 * Checks if the given hash matches the given options.
 * @link https://secure.php.net/manual/en/function.password-verify.php
 * @param string $password The user's password.
 * @param string $hash A hash created by password_hash().
 * @return bool Returns TRUE if the password and hash match, or FALSE otherwise.
 * @since 5.5
 */
function password_verify(string $password, string $hash): bool {}

/**
 * Return a complete list of all registered password hashing algorithms.
 * @return string[]
 * @since 7.4
 */
function password_algos(): array {}
// End of password v.

Jinak pokud použiji 11 12 jak systém pozná co jsem zadal ? Je možné že je něco špatně nastavené ?

 $passwords = new Passwords(PASSWORD_BCRYPT, ['cost' => 10]); // 11 12 nebo 10 je jedno nebo musím ještě něco někde upravit ?
        $res = $passwords->hash($data->password);

Moc děkuji za případnou pomoc

Marek Bartoš
Nette Blogger | 1146
+
+2
-

Password verify nic nedělá vrací bool

Jak nic nedělá? Pokud heslo odpovídá hashi, tak vrací true, jinak false

Jinak pokud použiji 11 12 jak systém pozná co jsem zadal ?

Nastavení algoritmu je součástí vygenerovaného hashe, viz https://github.com/…c-sf-spec.md
Tím že jsi nastavení pro nové hashe změnil se ti nic nerozbije

Editoval Marek Bartoš (28. 7. 2022 22:31)

mimacala
Člen | 113
+
0
-

Aha, jasné, pak tedy nechápu proč mi verify vrací false, v DB mám varchar 255 znaků, takže to je také v pořádku.

EDIT: V kódu jako takovém vypadá vše ok ? Děkuji
EDIT2: Zkusil jsem kód zjednodušit, ale stejný problém musím něco přehlížet :)

use Nette;
use App\Components\Formulare\FormularPrihlaseni;
use Nette\Application\UI\Form;
use App\model\Kontrola;
use Nette\Database\Explorer;


class PrihlaseniPresenter extends Nette\Application\UI\Presenter
{

    public function __construct(

        private FormularPrihlaseni $formularPrihlaseni,
        private Kontrola $kontrola,
        private Explorer  $db,
        private Nette\Security\Passwords $passwords,
    )
    {

    }

    public function renderPrihlasit()
    {
        $this->setLayout('LogRegLayout');
    }
    public function actionOut(): void
    {
        $this->getUser()->logout(true);
        $this->flashMessage('Odhlášení bylo úspěšné.', "success");
        $this->redirect("Homepage:", );
    }

    public function createComponentPrihlasit()
    {
        $form = new Form;
        $form->addEmail('email', 'Email:');
        $form->addPassword('heslo', 'Heslo:');
        $form->addSubmit('send', 'Přihlásit');
        $form->onSuccess[] = [$this, 'OnSucceeded'];

     return $form;
    }

    public function OnSucceeded(Form $form,$data): void
    {

        $row = $this->db->table('uzivatele')
            ->where('email', $data->email)
            ->fetch();


        if (!$row) {
            throw new Nette\Security\AuthenticationException('User not found.');
        }

        if ($this->passwords->verify($data->heslo, $row->heslo) == true) {
            $identity = new Nette\Security\SimpleIdentity($row->id, $row->role);
            $this->user->login($identity);
        } else {
            throw new Nette\Security\AuthenticationException('Invalid password.');
        }


    }

}

Jak bych mohl heslo zpátky převěst z hashe pro kontrolu správného uložení ? Děkuji

Editoval mimacala (28. 7. 2022 23:07)

mimacala
Člen | 113
+
0
-

Už to mám, naprostá banalita jako vždy :D ..
chyba byla v latte v input hesle.

<input  n:name="heslo" class="form-control" type="password" name="heslo" placeholder="Heslo"> // obsahuje 2x name

i tak moc děkuji za čas :)