A simple, lightweight library for generating and verifying one-time passwords supporting TOTP, HOTP, and YubiKey OTP.
https://gibme-npm.github.io/mfa/
npm install @gibme/mfa
or
yarn add @gibme/mfa
Import everything from the main entry point, or use subpath imports for tree-shaking:
// Full import
import { Secret, TOTP, HOTP, YubiKeyOTP } from '@gibme/mfa';
// Subpath imports
import Secret from '@gibme/mfa/secret';
import TOTP from '@gibme/mfa/totp';
import HOTP from '@gibme/mfa/hotp';
import YubiKeyOTP from '@gibme/mfa/yubikey';
The seed used with TOTP and HOTP one-time passwords. Generates a cryptographically random 20-byte secret by default.
import { Secret } from '@gibme/mfa';
const secret = new Secret();
console.log(secret.toString()); // base32-encoded string
import { Secret } from '@gibme/mfa';
const secret = new Secret('ZK26SHUWGERAHUOTQMV7V3YMWIX4XUWS');
import { Secret } from '@gibme/mfa';
const secret = new Secret({ size: 32 });
Time-based One-Time Password. The OTP is derived from the current time and a configurable period (default: 30 seconds). Compatible with authenticator apps such as Google Authenticator, Authy, and 1Password.
import { TOTP } from '@gibme/mfa';
const [token, secret] = TOTP.generate();
console.log(token); // e.g. "482901"
console.log(secret.toString()); // base32 secret for storage
import { TOTP, Secret } from '@gibme/mfa';
const secret = new Secret('ZK26SHUWGERAHUOTQMV7V3YMWIX4XUWS');
const [token] = TOTP.generate({ secret });
import { TOTP } from '@gibme/mfa';
const [success, delta] = TOTP.verify(token, { secret });
if (!success) {
throw new Error('Invalid OTP code supplied');
}
Generate a URI for provisioning authenticator apps:
import { TOTP } from '@gibme/mfa';
const uri = TOTP.toString({
secret,
issuer: 'My App',
label: 'user@example.com'
});
// otpauth://totp/user%40example.com?secret=...&issuer=My%20App&algorithm=SHA1&digits=6&period=30
import { TOTP } from '@gibme/mfa';
const qrUrl = TOTP.toQRCodeURL({
secret,
issuer: 'My App',
label: 'user@example.com'
});
| Option | Type | Default | Description |
|---|---|---|---|
secret |
Secret | string |
Random | The shared secret |
period |
number |
30 |
Time step in seconds |
digits |
6 | 8 |
6 |
OTP digit count |
algorithm |
DigestAlgorithm |
SHA1 |
Hash algorithm (SHA1, SHA256, SHA512) |
window |
number |
1 |
Verification tolerance window |
issuer |
string |
'' |
Issuer name for authenticator apps |
label |
string |
'TOTP Authenticator' |
Account label for authenticator apps |
timestamp |
Date | number |
Date.now() |
Time reference for OTP calculation |
HMAC-based One-Time Password. OTPs are generated based on a counter value that must be incremented after each use.
import { HOTP } from '@gibme/mfa';
const [token, secret] = HOTP.generate({ counter: 0 });
import { HOTP } from '@gibme/mfa';
const [success, delta] = HOTP.verify(token, { secret, counter: 0 });
if (!success) {
throw new Error('Invalid OTP code supplied');
}
import { HOTP } from '@gibme/mfa';
const uri = HOTP.toString({
secret,
issuer: 'My App',
label: 'user@example.com',
counter: 0
});
import { HOTP } from '@gibme/mfa';
const qrUrl = HOTP.toQRCodeURL({
secret,
issuer: 'My App',
label: 'user@example.com'
});
| Option | Type | Default | Description |
|---|---|---|---|
secret |
Secret | string |
Random | The shared secret |
counter |
number |
0 |
HMAC counter value |
digits |
6 | 8 |
6 |
OTP digit count |
algorithm |
DigestAlgorithm |
SHA1 |
Hash algorithm (SHA1, SHA256, SHA512) |
window |
number |
1 |
Verification tolerance window |
issuer |
string |
'' |
Issuer name for authenticator apps |
label |
string |
'HOTP Authenticator' |
Account label for authenticator apps |
Verify YubiKey one-time passwords against the Yubico validation servers.
To obtain a YubiKey API key, visit the Yubico API key signup page.
import { YubiKeyOTP } from '@gibme/mfa';
const response = await YubiKeyOTP.verify(otp, {
clientId: 12345,
apiKey: 'yourapikey'
});
if (!response.valid) {
throw new Error('Invalid OTP code supplied');
}
console.log(response.deviceId); // YubiKey device identifier
console.log(response.signatureValid); // Server signature verification
console.log(response.status); // Validation status code
| Option | Type | Default | Description |
|---|---|---|---|
clientId |
number | string |
Required | Yubico API client ID |
apiKey |
string |
Required | Yubico API key |
serviceUrl |
string |
'https://api.yubico.com/wsapi/2.0/verify' |
Validation server URL |
| Status | Description |
|---|---|
OK |
OTP is valid |
BAD_OTP |
OTP is invalid format |
REPLAYED_OTP |
OTP has already been used |
BAD_SIGNATURE |
HMAC signature verification failed |
MISSING_PARAMETER |
Required parameter missing from request |
NO_SUCH_CLIENT |
Client ID does not exist |
OPERATION_NOT_ALLOWED |
Client ID not authorized for this operation |
BACKEND_ERROR |
Unexpected server error |
NOT_ENOUGH_ANSWERS |
Insufficient validation server responses |
REPLAYED_REQUEST |
Request with this nonce was already seen |
MIT