Nasazování GDPR s sebou přineslo, mimo jiné, i rozšíření počtu e-mailů, ve kterých uživatele žádáme o potvrzení jeho akce (přihlášení k odběru novinek, registrace atp.). Dříve takových e-mailů bylo jen pár, např. žádost o ohodnocení produktu nebo obnovení hesla. Nově to jsou všechny dvojité souhlasy.

Nejde o GDPR, jde o uživatele

Tzv. “double opt-in” ověření vykonané akce však nečinní za dost pouze GDPR. Jde o vhodný způsob ověření bez ohledu na legislativu. Domníváme se totiž, že i obyčejné potvrzení souhlasu s odběrem newsletteru si zaslouží, aby bylo prokazatelné, uživatel byl chráněn a riziko cíleného zneužití URL bylo minimální. 

Jak jsme zvolili technické řešení?

Pro ověřování předávaných údajů jsme využili poměrně nový standard výměny dat JSON Web Token (JWT) popsaný v samostatném RFC 7519. Na přehledných stránkách projektu se dočtete, co všechno zmíněný standard popisuje a jak kýženého výsledku dosahuje. Kromě toho na webu najdete i on-line nástroj pro kontrolu vygenerovaných JWT tokenů nebo filtrovatelný přehled implementací JWT knihoven pro různé programovací jazyky.

 

double opt-in

“double opt-in” - ověření vykonané akce

 

Co je to JSON Web Token

JWT je standard, který definuje, jak předávat data mezi dvěma systémy s ověřením, že při jejich přenosu nedošlo ke změně - jsou tzv. digitálně podepsaná (JWT data nešifruje). Převod dat probíhá jednoduše. Potřebná data se podepíšou pomocí zvoleného algoritmu (algoritmy jsou součástí knihoven, stačí vybrat), vytvoří se hlavička zprávy s parametry podepisujícího algoritmu a spojí se se samotnými daty a podpisem dat. 

Vše tvoří ve výsledku jeden řetězec. Délka hlavičky i podpisu je neměnná vzhledem k délce zprávy, mění se jen délka těla zprávy. Výsledná zpráva je zakódována do Base64, aby nedošlo k rozbití zprávy při přenosu vlivem špatného kódování apod.

Chcete-li si tak přenést e-mailovou adresu pro potvrzení odběru newsletteru, budete zřejmě potřebovat poslat v potvrzovací URL parametry “email=karel@novak.cz”. 

Při použití JWT pošlete:

“token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImthcmVsQG5vdmFrLmN6In0.
o0gDqK309YaFdZSI4RF1HzUdZYln7o5GUeui-enHjoST4l-EhgkMszkYZ0snYjNpsqVyIxz7l0WWN_9nvJZsrQ”. 
Na první pohled je odkaz znatelně delší. V těle e-mailu je odkaz ovšem schovaný za tlačítko vyzývající k akci, takže uživatel tvar URL neuvidí.

 

Přihlášení k newsletteru

Přihlášení k newsletteru

 

Po přijetí takového požadavku budete vědět, že odkaz byl vygenerován ve vašem systému.

Výhody JWT v praxi

Standard JWT obsahuje několik variant, kterými je možné povahu tokenu upravit. Např. vám dovolí stanovit platnost tokenu, do kdy je maximálně validní. Generujete-li odkazy pro změnu hesla, je žádoucí mít odkaz platný jen omezený čas, aby se snížila doba k provedení útoku. 

Do teď jsme si k uživateli ukládali náhodně vygenerovaný token a datum platnosti tokenu. S nasazením JWT je délka platnosti tokenu už uložená přímo v něm. Mimo jiné nám odpadlo generování náhodného tokenu do databáze a s tím spojená režie (mazání starých tokenů, nutnost mít index nad dalším sloupcem atd.) Stačí už jen logovat, že došlo k žádosti.

Dále si pohráváme s myšlenkou, že by převod na podepsaný token prováděl už automaticky router v aplikaci. O tom možná příště.

Nasazení JWT do našeho řešení od kolegy Marka si můžete prohlédnout v repozitáři na GitHubu.

 

Diskuze