Node.js Authenticator
| Sponsored by ppl
Two- and Multi- Factor Authenication (2FA / MFA) for node.js
There are a number of apps that various websites use to give you 6-digit codes to increase security when you log in:
There are many Services that Support MFA,
including Google, Microsoft, Facebook, and Digital Ocean for starters.
This module uses notp
which implements TOTP
(RFC 6238)
(the Authenticator standard), which is based on HOTP
(RFC 4226)
to provide codes that are exactly compatible with all other Authenticator apps and services that use them.
Browser & Commandline Authenticator
You may also be interested in
Install
node.js api
npm install authenticator --save
command line
npm install authenticator-cli --global
Usage
node.js api
'use strict';
var authenticator = require('authenticator');
var formattedKey = authenticator.generateKey();
var formattedToken = authenticator.generateToken(formattedKey);
authenticator.verifyToken(formattedKey, formattedToken);
authenticator.verifyToken(formattedKey, '000 000');
authenticator.generateTotpUri(formattedKey, "john.doe@email.com", "ACME Co", 'SHA1', 6, 30);
command line
# see help
authenticator --help
# generate a key and display qr code
authenticator --qr
API
generateKey()
generateToken(formattedKey)
verifyToken(formattedKey, formattedToken)
generateTotpUri(formattedKey, accountName, issuer, algorithm, digits, period)
OTPAuth Scheme
Note that ISSUER
is specified twice for backwards / forwards compatibility.
QR Code
See https://davidshimjs.github.io/qrcodejs/ and https://github.com/soldair/node-qrcode.
Example use with qrcode.js
in the browser:
'use strict';
var el = document.querySelector('.js-qrcode-canvas');
var link = "otpauth://totp/{{NAME}}?secret={{KEY}}";
var name = "Your Service";
var key = "acqo ua72 d3yf a4e5 uorx ztkh j2xl 3wiz".replace(/\W/g, '').toLowerCase();
var qr = new QRCode(el, {
text: link.replace(/{{NAME}}/g, name).replace(/{{KEY}}/g, key)
});
Formatting
All non-alphanumeric characters are ignored, so you could just as well use hyphens
or periods or whatever suites your use case.
These are just as valid:
- "acqo ua72 d3yf a4e5 - uorx ztkh j2xl 3wiz"
- "98.24.63"
0, 1, 8, and 9 also not used (so that base32).
To further avoid confusion with O, o, L, l, I, B, and g
you may wish to display lowercase instead of uppercase.
TODO: should this library replace 0 with o, 1 with l (or I?), 8 with b, 9 with g, and so on?
90-second Window
The window is set to +/- 1, meaning each token is valid for a total of 90 seconds
(-30 seconds, +0 seconds, and +30 seconds)
to account for time drift (which should be very rare for mobile devices)
and humans who are handicapped or otherwise struggle with quick fine motor skills (like my grandma).
Why not SpeakEasy?
It doesn't use native node crypto and there are open security issues which have been left unaddressed.