Vytvoření hashe pro přihlášení uživatele

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

Dobrý den,

v nette jsem absolutní začátečník a po projetí „vytvořte první aplikaci“ jsem se rozhodl prohloubit znalosti v přihlašování a rolích uživatelů a snažím se postupovat podle postupu zde https://doc.nette.org/…thentication

Problém je v tom že nedovedu do databáze vložit správný otisk hesla. V dokumentaci je psané že ve sloupci password je otisk – bcrypt hesla (předpokládám toho co píšu do přihlašovacího formuláře). Snažím se tedy pomocí admineru vytvořit údaje pro přihlášení a tak jsem pro vygenerování hashe využil http://bcrypthashgenerator.apphb.com/

Bohužel se zdá že vygenerovaný hash není pro zadaný vstup vždy stejný (pravděpodobně se to solí). Zajímalo by mě tedy jak si mám takový hash který vložím do db vygenerovat aby mi fungovalo přihlašování a ověření přes db přesně jako v uvedeném příkladu v dokumentaci.

Děkuji za pomoc.

Takto vypadá můj kód:

<?php
namespace App\Presenters;
use Nette;
use Nette\Security as NS;

class MyAuthenticator extends Nette\Object implements NS\IAuthenticator
{
    public $database;

    function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    function authenticate(array $credentials)
    {
        list($username, $password) = $credentials;
        $row = $this->database->table('users')
            ->where('username', $username)->fetch();

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

        if (!NS\Passwords::verify($password, $row->password)) {
            throw new NS\AuthenticationException('Invalid password.'.NS\Passwords::hash("heslo"));
        }

        return new NS\Identity($row->id, $row->role, array('username' => $row->username));
    }
}

Při výpisu chyby si nechám vypsat výsledek funkce hash který vložím do databáze a poté se přihlašuji za využití hesla heslo a bohužel to nefunguje.

Editoval pastyx (14. 8. 2015 11:31)

ZahorskyJan
Člen | 59
+
0
-

Jestli se nepletu, tak v sandboxu je v rootu složka bin ve které jejediný skript create-user.php, který je tam přesně kvůli tomu co řešíte = vytovření uživatele s heslem. Je napsaný pro spouštění z příkazové řádky. Když se podíváte do toho skriptu, jak se uživatel tvoří, bude Vám vše hned jasné. Parametry jsou login a heslo.

Mysteria
Člen | 797
+
+2
-

Pokud používáš pro hashování třídu Nette\Security\Passwords, tak si třeba kdekoliv vypiš

Nette\Security\Passwords::hash('myPassword')

a vygenerovaný hash vlož do databáze.

pastyx
Člen | 25
+
0
-

Bude tohle fungovat i pro vlastní autentikátor ?

pastyx
Člen | 25
+
0
-

Tohle jsem už zkoušel a bohužel to vždy generuje jiný hash a nefunguje.

David Matějka
Moderator | 6445
+
0
-

musis to pak overovat pomoci metody verify, nikoliv ==. Stejne jako je to v sandboxuhttps://github.com/nette/sandbox/blob/master/app/model/UserManager.php#L46

David Matějka
Moderator | 6445
+
0
-

musis to pak overovat pomoci metody verify, nikoliv ==. Stejne jako je to v sandboxu https://github.com/…rManager.php#L46

pastyx
Člen | 25
+
0
-

to samozřejmě dělám, použil jsem kód z ukázky v dokumentaci

pastyx
Člen | 25
+
0
-

editoval jsem otázku s kódem mého autentifikátoru kde si generuji hash

vvoody
Člen | 910
+
0
-

To že vždy vygeneruje iný hash je úplne v poriadku.

vvoody
Člen | 910
+
0
-

Doplň prosím kód prihlasovacieho formulára.

pastyx
Člen | 25
+
0
-

Ano, očekávám nějakou metodu solení ale problém je v tom když vezmu ten hash a vložím ho do db tak mi nefunguje verify() resp. vrací false.

Pavel Kravčík
Člen | 1196
+
0
-

A máš dostatečně „velký“ sloupec v DB? Neořezává se Ti část? A pak to porovnání bude FALSE.

ZahorskyJan
Člen | 59
+
0
-

Je to závislé na App\Model\UserManager, u kterého volá metodu add(), takže pokud UserManager má nějakou svoji autentikaci, měl by zajistit i správné vytvoření nového uživatele a skript create-user.php by se neměl měnit.

pastyx
Člen | 25
+
0
-

Ano! Takovou hloupou chybu jsem neudělal už hodně dlouho. Velikost řádku pro hash nebyla dostatečná a bez jakéhokoliv varování se část uřezávala a nebylo to na první pohled poznat. Děkuji všem za pomoc.

pastyx
Člen | 25
+
0
-

Problém vyřešen, děkuji všem za pomoc. Problém byl v nedostatečné velikosti řádku pro hash (hloupá chyba z nepozornosti).