Login form vlastní javascript

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

Dobrý den, snažím se zprovoznit přihlašovací formulář pomocí Nette a moc se mi to nedaří kůli javascriptu. Jde o to, že potřebuji aby heslo a účet museli být vyplněny.

zjednodušený přihlašovací formulář

$this->addText('account', 'účet:')
  ->setRequired('Účet musí být vyplněn!');
$this->addPassword('password', 'heslo:')
  ->setRequired('Heslo musí být vyplněno!');
$this->addSubmit('send', 'přihlásit')
->getControlPrototype()
->onClick('foo()');
$this->addHidden('sha_password');
$this->addHidden('key');

To mám tedy formulář, který obsahuje účet, heslo, klíč právě vygenerovaného formuláře a sha_password kam potom vložím heslo, které se zahashuje na straně klienta.

Teď mám nějakou šablonu v které je následující script:

<script src="{$basePath}/js/sha512-min.js" type="text/javascript"></script>

    <script language="javascript" type="text/javascript">
        function foo()
        {
              $("#frm-adminLoginForm input[name=sha_password]").val(
                  hex_sha512($("#frm-adminLoginForm input[name=password]").val(),
                 $("#frm-adminLoginForm input[name=key]").val())
              );
              $("$frm-adminLoginForm input[name=password]").prop("disabled", true);
        }
    </script>

a právě tady nastane problém. Jelikož se validace formuláře provede až po mém scriptu tak v tu dobu už je pole s heslem „vypnuto“. Nette mi vrátí, že musím vyplnit heslo. Já samozřejmě potřebuji, aby se mi heslo neposílalo, chci jen to zahashované. Jde nějakým způsobem provést můj script až po validaci nette forms? Předem díky! :)

Томас
Člen | 85
+
0
-

Tak nakonec jsem to nějak vyřešil :-D děkuji za psychickou podporu. :P

Jan Endel
Člen | 1016
+
0
-

Mohl bys jednak tady napsat jak nakonec pro ostatní tápající a jednak – Přihlašovací formulář má být vždy na https spojení, pak bys něco takového nemusel řešit.

akadlec
Člen | 1326
+
0
-

@Jan Endel: Přihlašovací formulář má být vždy na https spojení
To vážně? To si fakt mají všichni co mají na webu přihlášení kupovat SSL certifikáty? Nebo snad využívat sdílený certifikát serveru který musí pak každý uživatel schválit? To snad ne.

Oli
Člen | 1215
+
0
-

akadlec: Záleží na tom jak moc bereš bezpečnost vážně. Respektive jak moc je pro tebe důležitá. Pro osobní blog to asi potřeba není. Pro nějakou službu, která zpracovává osobní/citlivá data už je bezpečnost poměrně zásadní parametr.

Jde o to, že když nemáš HTTPS a chceš se připojit například přes veřejnou wi-finu, tak všichni můžou koukat co posíláš v hlavičce. Můžou teda koukat co posíláš v POST. Pokud nemáš šifrování pomocí js, tak se heslo a jméno posílá v plain textu a až na serveru hashuje. Proto bych taky považoval HTTPS za poměrně důležitej faktor bezpečnosti ;-)

Томас
Člen | 85
+
0
-

Ahoj, jop sorry. Vyřešil jsem to tak, že jsem si formulář napsal sám. Zjednodušeně

<form n:name="MujForm" onSubmit="validate()">
    <label n:name="account">Jméno:</label>
    <input n:name="account"/>
    <label n:name="password">Heslo:</label>
    <input n:name="password"/>
    <input n:name="send"/>
</form>

Všechny validační pravidla a podobně z komponenty se mi doplňí do tohodle formu + mám k tomu ten submit event. Přes jednu část problému sem se ale stále nedostal. Pomocí javascriptu samozřejmě potřebuji vzít heslo, které zahashuju s unikátním klíčem formuláře do sebe a uložit ho do nějakého hidden inputu. To není problém, problém nastane až když nastavím password input jako disabled… aby se mi neposílal na server, ale jen to moje zahashované heslo. V mé komponentě s formulářem nesmí být password required protože nikdy vyplněn nebude. Já bych ho ale required chtěl a nechci to řešit přímo v tom scriptu ale v komponentě toho formuláře. Nejde to nějak jednoduše obejít? Nebo se s tím mám naučit žít? :D

Mesiah
Člen | 240
+
0
-

Томас napsal(a):

Ahoj, jop sorry. Vyřešil jsem to tak, že jsem si formulář napsal sám. Zjednodušeně

<form n:name="MujForm" onSubmit="validate()">
    <label n:name="account">Jméno:</label>
    <input n:name="account"/>
    <label n:name="password">Heslo:</label>
    <input n:name="password"/>
    <input n:name="send"/>
</form>

Všechny validační pravidla a podobně z komponenty se mi doplňí do tohodle formu + mám k tomu ten submit event. Přes jednu část problému sem se ale stále nedostal. Pomocí javascriptu samozřejmě potřebuji vzít heslo, které zahashuju s unikátním klíčem formuláře do sebe a uložit ho do nějakého hidden inputu. To není problém, problém nastane až když nastavím password input jako disabled… aby se mi neposílal na server, ale jen to moje zahashované heslo. V mé komponentě s formulářem nesmí být password required protože nikdy vyplněn nebude. Já bych ho ale required chtěl a nechci to řešit přímo v tom scriptu ale v komponentě toho formuláře. Nejde to nějak jednoduše obejít? Nebo se s tím mám naučit žít? :D

Teoreticky můžeš dát do definice formuláře podmínku ve stylu: „když bude vyplněný hidden, tak nepožaduj vyplněné heslo“.
Nebo při submitu nastav heslo na nějaký ultimátní řetězec a pokud bys na serveru dostal něco jiného, pak víš, že odesilatel má vypnutý javascript, ale tohle řešení je myslím takové nehezké…