Přihlašování pomocí URL

hary

Přihlašování pomocí URL
« kdy: 20. 01. 2021, 17:50:11 »
Zdraví, hodlám se pustit do vývoje menší jednoúčelové webové aplikace a přemýšlím, že bych místo standardních uživatelských účtů udělal přihlašování pomocí tokenů v URL. Myšlenka je taková, že uživatel zadá mail a na ten mu přijde odkaz do jeho portfolia. Odkaz si pak uloží třeba do záložek...

Nenapadají vás nějaké nevýhody, které by tento přístup mohl mít?

Očividně to není úplně obvyklé řešení, všude otravují s účty a hesly... Předpokládám že tam nebudou citlivá nebo zneužitelná data. Napadá mě ještě zakázat vyhledávačům indexování.


PanVP

Re:Přihlašování pomocí URL
« Odpověď #1 kdy: 20. 01. 2021, 18:52:00 »
Podle tvých otázek o tom nic nevíš, ale to nevadí, pusť se do toho a držím palce.

Zatím je zbytečné ti vysvětlovat pojmy jako robots.txt
Nevýhoda tvého řešení je v tom, že si uživatel musí vždy najít ten tvůj ověřovací e-mail s linkem.
Další nevýhoda je v tom, že při použití krátkého tokenu (například uzivatel=a123), to někdo bruteforcne.
S pythonem, který se někam snaží připojit, dokážu za vteřinu ověřit asi 32 tisíc různých kombinací a to je jen "sranda skript". Takže držím palce ;-)

Re:Přihlašování pomocí URL
« Odpověď #2 kdy: 20. 01. 2021, 19:31:32 »
Používá se to celkem často, ale jen pro ověření v určitém časovém limitu (pak platnost tokenu vyprší). Třeba změna hesla, potvrzení akce apod.

Re:Přihlašování pomocí URL
« Odpověď #3 kdy: 20. 01. 2021, 19:50:21 »
Nevýhodu to má jednu dost podstatnou a docela zřejmou – URL není považováno za dlouhodobě tajný údaj, takže se nedá spoléhat na to, že někde neunikne. Zůstává v historii prohlížeče, v hlavičce Referer ji dostanou všechny objekty stahované ve stránce (externí obrázky, skripty apod.), všechny stránky, na které se uživatel z vaší stránky proklikne. Proto mívají takováhle autentizační URL omezenou časovou platnost.

Pokud opravdu chcete jít touhle cestou, doporučil bych alespoň ten přihlašovací token nedávat do serverové části URL, ale do fragmentu (za hash). Ten neopustí prohlížeč, není v Referer hlavičkách. Samozřejmě ho pak budete muset JavaScriptem přečíst a přidat do autentizační hlavičky, aby měl server podle čeho uživatele autentizovat.

Také určitě budete potřebovat možnost ten token zneplatnit v případě, kdy uživateli unikne.

Nicméně osobně bych ulehčení přihlášení řešil spíš tak, že uživatelům povolíte i autentizaci pomocí Facebooku, Google, Twiteru, MojeID, případně služeb, které jsou v daném oboru obvyklé. Váš způsob, že si uživatelé budou muset uložit adresu do oblíbených nebo jít pokaždé přes e-mail – vy tak možná web používáte, ale většina uživatelů asi ne.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Přihlašování pomocí URL
« Odpověď #4 kdy: 20. 01. 2021, 20:50:59 »
Na to by se mohla hodit HTTP autentizace. Stačí, když se uživatel jednou přihlásí.


Re:Přihlašování pomocí URL
« Odpověď #5 kdy: 20. 01. 2021, 21:18:42 »
Na to by se mohla hodit HTTP autentizace. Stačí, když se uživatel jednou přihlásí.
To záleží na tom, zda a jak si prohlížeč zapamatovává hesla. A v jiném prohlížeči (na jiném počítači) se bude muset přihlašovat znovu. To už může použít nejpoužívanější autentizaci přes formulář, kde budou aspoň fungovat i správci hesel implementovaní jako rozšíření prohlížeče (ti na dialog HTTP autentizace nedosáhnou).

hary

Re:Přihlašování pomocí URL
« Odpověď #6 kdy: 21. 01. 2021, 00:19:51 »
Podle tvých otázek o tom nic nevíš, ale to nevadí, pusť se do toho a držím palce.

Zatím je zbytečné ti vysvětlovat pojmy jako robots.txt
Nevýhoda tvého řešení je v tom, že si uživatel musí vždy najít ten tvůj ověřovací e-mail s linkem.
Další nevýhoda je v tom, že při použití krátkého tokenu (například uzivatel=a123), to někdo bruteforcne.
S pythonem, který se někam snaží připojit, dokážu za vteřinu ověřit asi 32 tisíc různých kombinací a to je jen "sranda skript". Takže držím palce ;-)

Haha. Ale jako jo, profesně weby nedělám a tímhle si snažím rozšířit obzory, abych byl i jako full-stack lopata.

Pak to můžeš zkusit.

hary

Re:Přihlašování pomocí URL
« Odpověď #7 kdy: 21. 01. 2021, 00:24:16 »
Nevýhodu to má jednu dost podstatnou a docela zřejmou – URL není považováno za dlouhodobě tajný údaj, takže se nedá spoléhat na to, že někde neunikne. Zůstává v historii prohlížeče, v hlavičce Referer ji dostanou všechny objekty stahované ve stránce (externí obrázky, skripty apod.), všechny stránky, na které se uživatel z vaší stránky proklikne. Proto mívají takováhle autentizační URL omezenou časovou platnost.

Pokud opravdu chcete jít touhle cestou, doporučil bych alespoň ten přihlašovací token nedávat do serverové části URL, ale do fragmentu (za hash). Ten neopustí prohlížeč, není v Referer hlavičkách. Samozřejmě ho pak budete muset JavaScriptem přečíst a přidat do autentizační hlavičky, aby měl server podle čeho uživatele autentizovat.

Také určitě budete potřebovat možnost ten token zneplatnit v případě, kdy uživateli unikne.

Nicméně osobně bych ulehčení přihlášení řešil spíš tak, že uživatelům povolíte i autentizaci pomocí Facebooku, Google, Twiteru, MojeID, případně služeb, které jsou v daném oboru obvyklé. Váš způsob, že si uživatelé budou muset uložit adresu do oblíbených nebo jít pokaždé přes e-mail – vy tak možná web používáte, ale většina uživatelů asi ne.

Děkuji, to jsou užitečné informace. Ještě to zvážím. Budu tam mít i klasickou autentizaci pro sebe jako admina, ale její zprovoznění pro všechny je spousta kódu navíc - zapomenutá hesla, požadavky na smazání účtu...

L..

  • ****
  • 302
    • Zobrazit profil
    • E-mail
Re:Přihlašování pomocí URL
« Odpověď #8 kdy: 21. 01. 2021, 08:21:35 »
A není řešení použít tam nějakého externího poskytovatele identity? MojeID / Google / Facebook / ...?

Já před lety řešil podobný problém. Psal jsem systém, kde si uživatel vybírá fotografie z focení k následné úpravě. A chtěl jsem obdobný scénář: Uživateli prostě jen pošlu odkaz, kde fotky vybírat, uživatelé si jej mohou přeposílat a přitom vím, kdo vybírá - jestli fotku hodnotil člověk, co na ní je, nebo někdo jiný ze skupiny. Na druhou stranu nechci, aby se bylo možné dostat se na jiné album (uhodnout jeho adresu).

Důležitým požadavkem byla minimální složitost, jak pro uživatele (nepotřebuje se registrovat), tak pro mne (žádné ruční přidělování práv, kdo může co vidět, prostě pošlu odkaz a je to).

Navrhl jsem to následovně:

- Album má jako identifikátor 32-znakový náhodný řetězec, který je v URL. Stejně tak fotky mají svoje náhodná id. Tedy dají se posílat odkazy na album, fotku, ale musím to id znát (dostat), není reálné ho uhodnout.

- Identifikace je pomocí identity z Facebooku. Poprvé musí uživatel potvrdit předání informací, při dalších návštěvách tam jde hned.

- Pro uživatele mám vytvořený lokálně záznam, kde jsou jeho data nacachována, abych mohl ukazovat ostatním uživatelům, kdo jak hodnotil.

- Mohu nastavit uživateli příznak, že může do administrace - tak z něho udělám administrátora (jsem zatím jediný, takže jsem to nastavoval prostě v SQL).

Za těch pár let s tím mám dobré zkušenosti. FB má skoro každý (jen v jednom případě dotyčný FB neměl) a když by to byl problém, mohl bych jednoduše přidat dalšího providera. Pro mě i pro uživatele je používání velmi jednoduché. Není to úplně super bezpečné, protože věřím externí autoritě, ale pro daný účel stačí.

Re:Přihlašování pomocí URL
« Odpověď #9 kdy: 21. 01. 2021, 09:04:29 »
Děkuji, to jsou užitečné informace. Ještě to zvážím. Budu tam mít i klasickou autentizaci pro sebe jako admina, ale její zprovoznění pro všechny je spousta kódu navíc - zapomenutá hesla, požadavky na smazání účtu...
Smazání účtu musíte řešit stejně. Místo zapomenutého hesla byste musel řešit zapomenuté URL. Musel byste řešit i změnu přihlašovacího URL, stejně jako změnu hesla. Myslím, že použití externího poskytovatele identity, bez možnosti vytvořit účet se jménem a heslem, je pořád menší zlo, než takhle nestandardní přihlašování. V MojeID si základní účet může vytvořit každý. Když použijete OpenID, tam si každý může provozovat vlastní server – kdyby měl někdo touhu opravdu nebýt závislý na žádném třetím poskytovateli.

Nebo použijte už hotové řešení, třeba Firebase Authentication. Jsou v tom jména a hesla, přihlašování přes Google, Facebook, Twitter, Apple, Microsoft, GitHub… Pokud nebudete chtít ověření přes telefon, máte to zdarma. To mi pro vás připadá jako nejlepší řešení.

Re:Přihlašování pomocí URL
« Odpověď #10 kdy: 21. 01. 2021, 10:24:51 »
Na to by se mohla hodit HTTP autentizace. Stačí, když se uživatel jednou přihlásí.

Jenze uz se nikdy neodhlasi protoze HTTP BASE AUTH to neumi. Musete zavrit okno browseru (a spolehat ze nebezi na pozadi) nebo restartovat server. Sice jsem videl nejaky ochcavky ve forme zaslani neplatneho hesla misto odhlaseni (coz vygeneruje chybu a vyzaduje spravny login), ale neni to moc spolehlive.

Hamparle

  • ****
  • 360
  • junior developer ucho
    • Zobrazit profil
    • E-mail
Re:Přihlašování pomocí URL
« Odpověď #11 kdy: 21. 01. 2021, 10:26:03 »
To co chce tazatel, je běžné a úspěsně se to používá. Je nutné myslet na bezpečné předání a uchování URL.
Samozřejmě to chce nějakou logiku kontroly přístupu, aby nebylo možné hádat 32000 přístupů za vteřinu.
Rozhodně nespoléhat na náhodný řetězec, minimálně by to chtělo zapojit J(son)W(eb)T(okens) a challenge-response (což na první pohled zní podivně, když je to jen přes URL, ale muselo by se to dělat právě na straně klienta, přes hash).

Taky záleží jestli to je pro nějaké domácí zápisky stavu špajzu pro úzký okruh nebo je to veřejná služba pro stovky miliony uživatelů.
« Poslední změna: 21. 01. 2021, 10:30:35 od Hamparle »

Re:Přihlašování pomocí URL
« Odpověď #12 kdy: 21. 01. 2021, 11:12:37 »
Je nutné myslet na bezpečné předání a uchování URL.
Autor na to může myslet jak chce, ale ničemu to nepomůže – předávání ani uchování URL nemá pod kontrolou.

Samozřejmě to chce nějakou logiku kontroly přístupu, aby nebylo možné hádat 32000 přístupů za vteřinu.
Právě naopak, tady by byla výhoda, že klíč může být dostatečně dlouhý, nebo-li prostor pro hádání natolik řídký, že nikomu nepomůže, i kdyby uměl zkoušet miliardu klíčů za vteřinu.

Rozhodně nespoléhat na náhodný řetězec, minimálně by to chtělo zapojit J(son)W(eb)T(okens)
Mám náladu na komickou vložku. Takže se zeptám – proč?

PanVP

Re:Přihlašování pomocí URL
« Odpověď #13 kdy: 21. 01. 2021, 12:42:13 »
Samozřejmě to chce nějakou logiku kontroly přístupu, aby nebylo možné hádat 32000 přístupů za vteřinu.
Právě naopak, tady by byla výhoda, že klíč může být dostatečně dlouhý, nebo-li prostor pro hádání natolik řídký, že nikomu nepomůže, i kdyby uměl zkoušet miliardu klíčů za vteřinu.

Kdo by to byl řekl, že s Jirsákem budu souhlasit :-D
Použití dlouhých klíčů skutečně dostatečně naředí celý prostor (což jsem i zmínil), navíc nám pomůže webserver, který není příliš rychlý a při nastavení vhodných pravidel proti útokům (DOS/DDOS) se to stane neefektivní.

Re:Přihlašování pomocí URL
« Odpověď #14 kdy: 21. 01. 2021, 12:59:20 »
Použití dlouhých klíčů skutečně dostatečně naředí celý prostor (což jsem i zmínil), navíc nám pomůže webserver, který není příliš rychlý a při nastavení vhodných pravidel proti útokům (DOS/DDOS) se to stane neefektivní.
Ten klíč musí být tak dlouhý, že to bude neefektivní i bez omezení proti DoS/DDoS útokům, i bez spoléhání na pomalost webserveru. Navrhněte to tak, aby to bylo neefektivní, i kdyby se útočník přímo na svém zařízení jedinou instrukcí procesoru dozvěděl, zda klíč existuje nebo neexistuje. A pak k tomu přidejte ještě několik řádů. Povolená délka URL je pro tohle opravdu dostatečná a přidat ke klíči pět deset bajtů navíc nikomu nic neudělá, ale vás to zbaví nutnosti nad tím přemýšlet.