gist January 2, 2025
OTP
Utility for implementing and verifying OTPs.// 2FA utils
import QRCode from 'qrcode';
import speakeasy from 'speakeasy';
export const generateSecret = async () => {
const secret = speakeasy.generateSecret();
return {
otpUrl: secret.otpauth_url,
secret: secret.base32,
};
};
export const secretToOtpAuthUrl = (secret: string, username: string) => {
const url = new URL(`otpauth://totp/${secret}?secret=${secret}&issuer=My%20Profiles - ${username}`);
return url.toString();
};
export const urlToQrCode = async (url: string) => {
const qrCodeUrl = await QRCode.toDataURL(url.toString());
return qrCodeUrl;
};
// Verify a token from users authenticator app or from generateToken().
export const verifyToken = async (secret: string, token: string) => {
const verified = speakeasy.totp.verify({
secret,
encoding: 'base32',
token,
});
return verified;
};
// Generate a token from their secret. Used for SMS or Email 2FA.
export const generateToken = async (secret: string) => {
const token = speakeasy.totp({
secret,
encoding: 'base32',
});
return token;
};