Autentizace v Nette Security – přidání dalších parametrů

DefenestrationPraha
Člen | 99
+
0
-

Řeším teď autentizaci v jednom projektu, kde je nezbytné mít vícefaktorovou autentizaci, například jednorázový kód zaslaný e-mailem či SMS, a narážím na to, že současné Nette bere autentizaci jako (username, password).

Jak třída Authenticator, funkce authenticate, tak i třída User, funkce login, bere jenom uživatelské jméno a heslo. To už je dnes trochu zastaralý přístup.

Rád bych věděl, co by si autoři Nette mysleli o možnosti přidat do signatury volitelnou array params:

public function authenticate(string $username, string $password, array $params = array())

do které by si konkrétní kód mohl nastrkat, co se mu zachce. Osobně jsem to tak u sebe udělal a odvodil si UserFacade od takto upraveného Authenticatoru, vše mi funguje hladce.

Marek Bartoš
Nette Blogger | 1146
+
+4
-

Authenticator je interface který vůbec nemusíš používat. Zkrátka si po své ose vyrob objekt Identity a předej ho do $user->login($identity)

Editoval Marek Bartoš (21. 7. 2022 17:27)

DefenestrationPraha
Člen | 99
+
0
-

Jasně, určitě nemusíš, ale Nette se obecně snaží o to, aby na tu securitu myslelo jako první. V mnoha jiných situacích se vysloveně snaží předejít možným bezpečnostním slabinám.

Když už se celý ten framework snaží své uživatele dostrkat k tomu, aby tam neměli XSS apod., tak by se možná je měl snažit strkat i k co nejbezpečnějším praktikám přihlašování. V současné době si nejspíš několik dalších, možná i několik desítek dalších, uživatelů Nette v podobné situaci jako já naprogramovalo svoje vlastní řešení přihlašování. To je celkem zbytečná duplikace téže práce, plus tam vznikne další skupina lidí, která si řekne „a co, heslo stačí, proč bych to řešil, když mám výchozí komponentu na jméno a heslo přímo v Nette“.

Podle mě by mělo smysl podporovat defaultně 2FA, stejně jako má smysl defaultně escapovat HTML v Latte šablonách.

Abych jen nekecal, jsem ochoten se o to svoje řešení podělit formou nějakého Pull requestu.

Editoval DefenestrationPraha (21. 7. 2022 18:45)

Marek Bartoš
Nette Blogger | 1146
+
+3
-

Doslova ti stačí ve své implementaci smazat implements Authenticator, výsledek volání authenticate() předat do $user->login() a parametry authenticate() si přepsat jak potřebuješ. Ověření uživatele pořád implementuješ sám, jen se to volá trochu jiným způsobem. Bezpečnost tím nesnížíš ani nezvýšíš, je to prostě jen jiný přístup.

David Kudera
Člen | 455
+
+1
-

Dřív jsem to řešil (ne)instalací tohoto:

https://github.com/…uthenticator

DefenestrationPraha
Člen | 99
+
0
-

Marek Bartoš napsal(a):

Doslova ti stačí ve své implementaci smazat implements Authenticator, výsledek volání authenticate() předat do $user->login() a parametry authenticate() si přepsat jak potřebuješ.

Pořád si myslím, že jedním z důvodů, proč frameworky vůbec vznikají, je ten, aby jejich uživatelé nemuseli programovat pořád to samé dokola a neduplikovali tutéž práci na tisíc drobně odlišných způsobů. Podle mě by sada lepších autentizačních mechanismů v Nette dávala dobrý smysl. Zrovna tu autentizaci řeší skoro každý web, tak aby měl k dispozici něco spolehlivého.

Možná si v tomto nerozumíme, ale framework je přece skoro z definice sbírka užitečných funkcí a objektů daná dohromady proto, aby si je každý nemusel programovat znovu sám.

Bezpečnost tím nesnížíš ani nezvýšíš, je to prostě jen jiný přístup.

Dvoufaktorová autentizace se obecně považuje za bezpečnější než pouhé přihlášení heslem. Není to dokonalé řešení problému, to není v securitě nikdy, ale rozhodně bych polemizoval s myšlenkou, že přihlášení heslem je stejně bezpečné jako přihlášení více faktory. Není.

DefenestrationPraha
Člen | 99
+
-1
-

Pepino napsal(a):

https://forum.nette.org/…te-nette-3-1#…

Díky, tak to mi přijde jako jednoznačná změna k horšímu.

Marek Bartoš
Nette Blogger | 1146
+
+5
-

Oba mluvíme o něčem úplně jiném. To co jsem popisoval je totéž, co odkazoval David Kudera. Jen voláš metody jinak. O tom zda je lepší ověřování jen heslem nebo dvoufázově a zda by to nebylo fajn mít přímo v Nette jsem nenapsal vůbec nic. Pouze jsem reagoval na tvůj problém, že nevíš jak je možné předat krom jména a hesla i jiné údaje.

DefenestrationPraha
Člen | 99
+
0
-

David Kudera napsal(a):

Dřív jsem to řešil (ne)instalací tohoto:

https://github.com/…uthenticator

Ano, to je jeden z problémů s jednomužnými pluginy, které nikdy nejsou začleněny do hlavního projektu … prostě na to jednoho dne te člověk přestane mít čas. Případně umře nebo něco jiného.

Takto třeba tiše zanikl další užitečný plugin pro PHPStorm – integrace Nette Testeru od Jiřího Pudila. Škoda, dokonce k němu existuje i pěkné video s vysvětlením základních funkcí.

https://plugins.jetbrains.com/…nette-tester

DefenestrationPraha
Člen | 99
+
-2
-

Marek Bartoš napsal(a):

Oba mluvíme o něčem úplně jiném. To co jsem popisoval je totéž, co odkazoval David Kudera. Jen voláš metody jinak. O tom zda je lepší ověřování jen heslem nebo dvoufázově a zda by to nebylo fajn mít přímo v Nette jsem nenapsal vůbec nic. Pouze jsem reagoval na tvůj problém, že nevíš jak je možné předat krom jména a hesla i jiné údaje.

Ano, tak teď už si rozumíme. Já jsem to mezitím u sebe nějak vyřešil, byť trochu jinak (napsal jsem si skript v PowerShellu, který prohledá vendor/nette a pozmění signatury metod authenticate() a login(), čímž to můžu automaticky udělat při každé aktualizaci Nette).

Existuje nějaký druh oficiálního kanálu, kam by mohli uživatelé navrhovat změny, které by v Nette rádi viděli? Ta 2FA je právě jednou z nich.

David Matějka
Moderator | 6445
+
+2
-
  • upravovat vendor je fakt špatný nápad
  • Authenticator interface nepoužívej a poslechni rady @MarekBartoš
  • navrhovat změny můžeš posláním pull requestu
Marek Bartoš
Nette Blogger | 1146
+
+1
-

Já jsem to mezitím u sebe nějak vyřešil, byť trochu jinak (napsal jsem si skript v PowerShellu, který prohledá vendor/nette a pozmění signatury metod

Existují legitimní důvody, proč používat patche vendoru, ale v takovém případě se používá https://github.com/…oser-patches


Ber to tak, že Nette řeší, co je po přihlášení a ne to, co je před ním. Je to samostatné téma, na které můžeš použít i jinou knihovnu.

Autentizace je dost komplexní téma a pro komunikaci mezi servery, mezi serverem a mobilbí aplikací, serverem a webem a dalšími bude vypadat jinak. Celé tohle téma se snaží řešit kupříkladu OAuth. V php je dostupná implementace od phpleague (https://oauth2.thephpleague.com).

DefenestrationPraha
Člen | 99
+
0
-

David Matějka napsal(a):

  • upravovat vendor je fakt špatný nápad

Rád bych si přečetl něco více o tom, proč. Mám za to, že jednou z výhod opensource je flexibilita.

DefenestrationPraha
Člen | 99
+
0
-

Marek Bartoš napsal(a):

Já jsem to mezitím u sebe nějak vyřešil, byť trochu jinak (napsal jsem si skript v PowerShellu, který prohledá vendor/nette a pozmění signatury metod

Existují legitimní důvody, proč používat patche vendoru, ale v takovém případě se používá https://github.com/…oser-patches


Ber to tak, že Nette řeší, co je po přihlášení a ne to, co je před ním. Je to samostatné téma, na které můžeš použít i jinou knihovnu.

Autentizace je dost komplexní téma a pro komunikaci mezi servery, mezi serverem a mobilbí aplikací, serverem a webem a dalšími bude vypadat jinak. Celé tohle téma se snaží řešit kupříkladu OAuth. V php je dostupná implementace od phpleague (https://oauth2.thephpleague.com).

Děkuji, prostuduji to.

Marek Bartoš
Nette Blogger | 1146
+
0
-

DefenestrationPraha napsal(a):

David Matějka napsal(a):

  • upravovat vendor je fakt špatný nápad

Rád bych si přečetl něco více o tom, proč. Mám za to, že jednou z výhod opensource je flexibilita.

Upravovat vendor balíky můžeš, ale ne přímo vendor složku. Nevíš, co se kdy změní (aktualizace balíku, přepsání tvých změn composer pluginem nebo composerem). Buď si naklonuješ git repozitář a instaluješ svůj fork, nebo, pokud potřebuješ použít fixy z více větví, tak použiješ patch files skrze Composer plugin co jsem odkazoval.