@zibuthe7j11/fugit-et-atque
Version:
> Typed library to work 2fa via Google Authenticator/Time-based TOTP/Hmac-based HOTP
81 lines (60 loc) • 3.67 kB
Markdown
# OTP io
> Typed library to work 2fa via Google Authenticator/Time-based TOTP/Hmac-based HOTP
[](https://github.com/zibuthe7j11/fugit-et-atque)
[](https://npmjs.com/package/@zibuthe7j11/fugit-et-atque)
[](https://github.com/zibuthe7j11/fugit-et-atque)
[](https://codecov.io/gh/zibuthe7j11/fugit-et-atque)
[](https://github.com/zibuthe7j11/fugit-et-atque)
[](https://snyk.io/advisor/npm-package/@zibuthe7j11/fugit-et-atque)
[](https://snyk.io/test/npm/@zibuthe7j11/fugit-et-atque)
[](https://npms.io/search?q=@zibuthe7j11/fugit-et-atque)
[](https://npmjs.com/package/@zibuthe7j11/fugit-et-atque)
[](https://github.com/zibuthe7j11/fugit-et-atque/blob/main/LICENSE.txt)
[](https://bundlephobia.com/package/@zibuthe7j11/fugit-et-atque)
[Example](#how-it-works) • [API Reference](./docs/api/README.md)
## Why use this lib?
- **Small.** Tree-shakable, 0 dependencies
- **Tested.** Compatibility with [Google Authenticator](https://github.com/google/google-authenticator/wiki/Key-Uri-Format) and with [RFC4226 (HOTP)](https://www.ietf.org/rfc/rfc4226.txt) and [RFC6238 (TOTP)](https://www.ietf.org/rfc/rfc6238.txt)
## Install
- `npm`
```bash
npm i @zibuthe7j11/fugit-et-atque
```
- `Yarn`
```bash
yarn add @zibuthe7j11/fugit-et-atque
```
## What is this?
- `HOTP` - HMAC-based One Time Password generation method. Uses incrementing with each login `counter` and `secret` to generate unique 6-8 digit codes.
- `TOTP` - Time-based, uses `current time` modulo `period` (seconds) as counter in `HOTP`,
- `Google Authenticator` - uses simplified version of `TOTP` to generate codes. Differences:
- Only `SHA-1` hash support
- Only 6 digit codes
- Keys should not be padded
- TOTP period is 30 seconds
Google Authenticator limits are defaults for this library.
## How it works?
```typescript
// 1. Import library - use totp (code changes with time)
import { totp, generateKey, getKeyUri } from "@zibuthe7j11/fugit-et-atque";
// 2. Import crypto adapter. Either `crypto-node` or `crypto-web` - API is identical
import { hmac, randomBytes } from "@zibuthe7j11/fugit-et-atque/crypto-node";
// 3. Get key from somewhere. Or generate it
const key = generateKey(randomBytes, /* bytes: */ 20); // 5-20 good for Google Authenticator
// 4. Get key import url
const url = getKeyUri({
type: "totp",
secret,
name: "User's Username",
issuer: "Your Site Name"
});
// 5. Show it to user as QR code - send it back to client
// Get 6-digit code back from him, as confirmation of saving secret key
const input = "...";
const code = await totp(hmac, { secret });
if (code === input) {
// 6. Done. User configured your key
}
```
## Api Reference
[API Reference](./docs/api/modules.md)