Jak vytvořit magické spojení s Node

Systém bez hesla, který Slack zavedl jako magický odkaz, je z mnoha důvodů opravdu dobrou alternativou k základnímu systému ověřování e-mailem / heslem. I když neovládáte úroveň zabezpečení šifrování hesel, domníváte se, že váš poskytovatel poštovní schránky uživatele je dostatečně bezpečný a že skutečnost, že vám vrátí token, který jste jim právě poslali, je dostatečná k jejich ověření. Tímto způsobem to vidíme jako levné OAuth ověřování (jako je Facebook), které nám neposkytuje žádné informace o uživateli.

rozdíl mezi oAuth a magickou vazbou

A co implementace?

S předchozím schématem víme, že budeme muset implementovat pouze 2 koncové body. Jeden pro odeslání žádosti o autentizační klíč a druhý pro autentizaci.

V koncovém bodě ověření potřebujeme 3 věci. Přístup do naší databáze k udržení účtu, generování tokenu a generování pošty. K vygenerování tokenu použijeme přístup JSON Web Token. Výhodou je, že do tokenu můžeme vložit nějaký obsah a ujistit se, že není upraven.

Nyní vygenerujeme odkaz obsahující token v dotazu a pošleme jej uživateli poštou.

Když náš uživatel klikne na tento odkaz, musíme zachytit token, který je předán jako parametr dotazu, dekódovat obsah a vložit jej do kontextu požadavku. Za tímto účelem stačí použít expresní middleware s názvem express-jwt.

Nyní, když uživatel klikne na odkaz, budeme mít jeho informace v kontextu a můžeme je pouze použít.

A tady je náš životní cyklus dokončen. Naši uživatelé se nyní mohou autentizovat pouze pomocí své e-mailové adresy.

A co zabezpečení?

Nejprve musíme vzít v úvahu, že poštovní schránka našeho uživatele může být ohrožena. Pokud někdo jiný zachytí poštu obsahující token, mohl by mít přístup k jeho účtu po celou dobu trvání našeho tokenu. Existuje několik možností, jak to vyřešit.

První bude mít tabulku blacklistů pro token, který chceme zrušit. Docela nepříjemné a proti principu vytváření tokenů JWT.

A co uvedení indexu revizí do tokenu, který bychom uložili do databáze? Tímto způsobem by se mohl přihlásit pouze token s poslední revizí. S tímto řešením také ztratíme princip JWT, protože se musíme podívat do databáze pokaždé, když uživatel zadá požadavek.

Nejkrásnějším řešením by mohlo být to, aby token, který pošleme poštou, měl opravdu krátkou životnost, například 1 hodinu, a na první žádost, kterou uživatel učiní na server, vygenerujeme nový token s delší životností.

Dalším silným řešením by bylo rozdělení tokenu na dva kusy. Pošlete první část poštou uživateli a v odpovědi na žádost vraťte druhou část zpět do aplikace. Tímto způsobem bude moci tento token znovu získat a autentizovat pouze tento mobilní telefon nebo prohlížeč.

Příklad by byl pěkný!

Zdrojový kód běžícího příkladu je k dispozici na následujícím odkazu.

Máte zájem o podání žádosti?