Dvoufaktorová autentizace s Node.js

Existuje celá řada strategií pro ochranu vašich důležitých online přihlašovacích údajů. Často slýcháme o správcích a generátorech hesel, ale pro mě je důležitější strategie používání dvoufaktorového ověřování (2FA). Hesla lze uhodnout, telefonní čísla lze podvrhnout, ale použití dvoufaktorového ověření v podstatě vyžaduje, aby uživatel vlastnil fyzické zařízení s aplikací, jako je Google Authenticator, s tajným klíčem pro danou aplikaci, který poskytuje další vrstvu zabezpečení.

Dvoufaktorovou autentizaci jsem nebral vážně, dokud mi někdo neukradl název domény a nepokusil se ho vyprat do bezpečného útočiště pro zlodějské domény. I když nevím, jak přesně to udělali, jsem si docela jistý, že získali přístup k mé e-mailové adrese, vytvořili filtry, abych e-maily neviděl atd.  Kdybych použil dvoufaktorové ověření, ani můj e-mail Účty GoDaddy mohly být přístupné. Nebo byste to mohli vzít od Codyho Browna, kterému bylo během několika minut ukradeno 8 000 $ v kryptoměně, protože prodejce použil ověření telefonního čísla, aby umožnil schvalování transakcí. Dnes používám dvoufaktorové ověřování pro všechny své důležité e-mailové, pracovní a finanční účty.

Protože 2FA používám tak často, chtěl jsem vidět, jak vývojář pro své uživatele tento proces spravuje. To by zahrnovalo vygenerování tajného klíče, vytvoření reprezentace jeho QR kódu, naskenování kódu do aplikace Google Authenticator (provádí uživatel) a následné ověření kódu poskytnutého GA pomocí klíče uživatele. Našel jsem k tomu snadno použitelnou knihovnu Node.js, speakeasy!

Krok nastavení 1: Vygenerujte tajný klíč

Za předpokladu, že jste nainstalovali speakeasy přes npm install speakeasy , nastavení dvoufaktorového ověřování je zahájeno vygenerováním jedinečného tajného klíče pro uživatele:

var speakeasy = require('speakeasy');

var secret = speakeasy.generateSecret({length: 20});
console.log(secret.base32); // Save this value to your DB for the user

// Example:  JFBVG4R7ORKHEZCFHZFW26L5F55SSP2Y

Tento tajný klíč by měl být uložen se záznamem uživatele ve vaší databázi, protože bude v budoucnu použit jako reference pro ověření 2FA kódů.

Krok nastavení 2: Vygenerujte obrázek QR

Aplikace jako Google Authenticator umožňují uživatelům naskenovat QR kód nebo zadat textový klíč. Skenování obrázku je mnohem rychlejší, takže nabízení QR kódu bude pro vašeho uživatele velmi pohodlné:

var QRCode = require('qrcode');

QRCode.toDataURL(secret.otpauth_url, function(err, image_data) {
  console.log(image_data); // A data URI for the QR code image
});

QRCode.toDataURL poskytuje URI obrazových dat, které můžete použít pro img src atribut. Pokud QR kód neznáte, bude vypadat nějak takto:

Uživatelský krok 1: Naskenujte QR kód / Přidejte web do aplikace Authenticator

V tomto okamžiku by měl uživatel otevřít aplikaci Google Authenticator (nebo Authy atd.) a naskenovat QR kód; do aplikace zařízení bude přidán záznam pro vaši webovou aplikaci. Od této chvíle, kdykoli se uživatel bude chtít přihlásit (nebo provést jakoukoli akci, kterou chcete chránit), by váš systém měl rozpoznat, že uživatel chce použít 2FA, a měli byste požadovat, aby zadal token ze své aplikace.

Pro účely ladění můžete získat hodnotu uživatelského kódu v daném čase pomocí:

// Load the secret.base32 from their user record in database
var secret = ...

var token = speakeasy.totp({
  secret: secret,
  encoding: 'base32'
});

Uživatelský krok 2:Poskytnutí tokenu / ověření tokenu

Když vaše webová aplikace vyzve uživatele k zadání aktuálního tokenu 2FA a uživatel poskytne 6místný token, webová aplikace musí tento token ověřit:

// This is provided the by the user via form POST
var userToken = params.get('token');

// Load the secret.base32 from their user record in database
var secret = ...

// Verify that the user token matches what it should at this moment
var verified = speakeasy.totp.verify({
  secret: secret,
  encoding: 'base32',
  token: userToken
});

Pokud se token shoduje, lze uživateli důvěřovat; pokud se token neshoduje, webová aplikace by měla uživatele vyzvat, aby to zkusil znovu. Pamatujte, že Authenticator poskytuje nový token každých {x} sekund, takže nesprávný token by neměl okamžitě vyvěsit červenou vlajku; token může jednoduše vypršet v době, kdy uživatel odeslal formulář.

Živá ukázka

Vývojáři speakeasy vytvořili živé demo speakeasy 2FA, se kterým si můžete zahrát, abyste porozuměli příslušným krokům z uživatelského i vývojářského pohledu.

Tento příspěvek má být pouze stručným přehledem implementace dvoufaktorové autentizace na vysoké úrovni – přečtěte si prosím dokumentaci speakeasy, abyste získali podrobnější vysvětlení a také se dozvěděli o konkrétnějších možnostech 2FA. V ideálním světě by byla dvoufaktorová autentizace ve výchozím nastavení pro většinu přihlášení povolena, ale pro většinu uživatelů webu (přemýšlejte o velmi netechnických uživatelích) to může být matoucí, takže chápu, proč je 2FA považováno za něco navíc. prozatím bezpečnostní opatření. Velké poděkování patří vývojářům speakeasy za jejich snadno použitelnou knihovnu Node.js, úžasnou dokumentaci a jednoduché demo!