UNPKG

2fa-plus

Version:

Implementation of two-factor authentication in Node, made simple.

1 lines 3.14 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import notp from \"notp\";\nimport crypto from \"crypto\";\nimport b32 from \"thirty-two\";\n\nexport async function generateSecret(name: string, account: string): Promise<{\n secret: string,\n uri: string,\n qr: string\n}> {\n const bin = crypto.randomBytes(20);\n const base32 = b32.encode(bin).toString(\"utf8\").replace(/=/g, \"\");\n\n const secret = base32\n .toLowerCase()\n .replace(/(\\w{4})/g, \"$1 \")\n .trim()\n .split(\" \")\n .join(\"\")\n .toUpperCase();\n\n const uri = `otpauth://totp/${name}:${account}?secret=${secret}&issuer=${name}`;\n \n // create QR code into base64 png string\n\n const qrLib = require(\"qrcode\");\n\n const qr = await new Promise<string>((resolve, reject) => {\n qrLib.toDataURL(uri, function (err: any, url: string) {\n if (err) {\n reject(err);\n } else {\n resolve(url);\n }\n });\n });\n\n return { secret, uri, qr };\n}\n\nexport async function generateToken(secret: string): Promise<string> {\n if (!secret) return \"\";\n\n const unformatted = secret.replace(/\\W+/g, \"\").toUpperCase();\n const bin = b32.decode(unformatted);\n\n return notp.totp.gen(bin);\n}\n\nexport async function verifyToken(secret: string, token: string): Promise<boolean> {\n if (!token || !secret) return false;\n\n const unformatted = secret.replace(/\\W+/g, \"\").toUpperCase();\n const bin = b32.decode(unformatted);\n\n const verify = notp.totp.verify(token.replace(/\\W+/g, \"\"), bin, {\n window: 4,\n time: 30\n });\n\n if (!verify) return false;\n\n // if notp returns any instance of delta, including 0, then it is valid. delta refers to time skew.\n if (verify.delta) return true;\n if (verify.delta === 0) return true;\n\n return false;\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,SAAS;AAEhB,SAAsB,eAAe,MAAc,SAIhD;AAAA;AACC,UAAM,MAAM,OAAO,YAAY,EAAE;AACjC,UAAM,SAAS,IAAI,OAAO,GAAG,EAAE,SAAS,MAAM,EAAE,QAAQ,MAAM,EAAE;AAEhE,UAAM,SAAS,OACV,YAAY,EACZ,QAAQ,YAAY,KAAK,EACzB,KAAK,EACL,MAAM,GAAG,EACT,KAAK,EAAE,EACP,YAAY;AAEjB,UAAM,MAAM,kBAAkB,IAAI,IAAI,OAAO,WAAW,MAAM,WAAW,IAAI;AAI7E,UAAM,QAAQ,UAAQ,QAAQ;AAE9B,UAAM,KAAK,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AACtD,YAAM,UAAU,KAAK,SAAU,KAAU,KAAa;AAClD,YAAI,KAAK;AACL,iBAAO,GAAG;AAAA,QACd,OAAO;AACH,kBAAQ,GAAG;AAAA,QACf;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AAED,WAAO,EAAE,QAAQ,KAAK,GAAG;AAAA,EAC7B;AAAA;AAEA,SAAsB,cAAc,QAAiC;AAAA;AACjE,QAAI,CAAC;AAAQ,aAAO;AAEpB,UAAM,cAAc,OAAO,QAAQ,QAAQ,EAAE,EAAE,YAAY;AAC3D,UAAM,MAAM,IAAI,OAAO,WAAW;AAElC,WAAO,KAAK,KAAK,IAAI,GAAG;AAAA,EAC5B;AAAA;AAEA,SAAsB,YAAY,QAAgB,OAAiC;AAAA;AAC/E,QAAI,CAAC,SAAS,CAAC;AAAQ,aAAO;AAE9B,UAAM,cAAc,OAAO,QAAQ,QAAQ,EAAE,EAAE,YAAY;AAC3D,UAAM,MAAM,IAAI,OAAO,WAAW;AAElC,UAAM,SAAS,KAAK,KAAK,OAAO,MAAM,QAAQ,QAAQ,EAAE,GAAG,KAAK;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM;AAAA,IACV,CAAC;AAED,QAAI,CAAC;AAAQ,aAAO;AAGpB,QAAI,OAAO;AAAO,aAAO;AACzB,QAAI,OAAO,UAAU;AAAG,aAAO;AAE/B,WAAO;AAAA,EACX;AAAA;","names":[]}