59 lines
No EOL
1.3 KiB
JavaScript
59 lines
No EOL
1.3 KiB
JavaScript
import qrcode from "qrcode";
|
|
|
|
import {
|
|
Secret,
|
|
TOTP
|
|
} from "otpauth";
|
|
|
|
import {
|
|
getConfig
|
|
} from "./config.mjs";
|
|
|
|
import {
|
|
setOTPSecret
|
|
} from "./mysql.mjs";
|
|
|
|
let appConfig = await getConfig();
|
|
|
|
export function generateOTPSecret() {
|
|
return new Promise((resolve, reject) => {
|
|
let otpSecret = new Secret({ length: 20 });
|
|
resolve(otpSecret.base32);
|
|
})
|
|
}
|
|
|
|
export function generateOTPQRCode(account, otpsecret) {
|
|
return new Promise(async (resolve, reject) => {
|
|
let totp = new TOTP({
|
|
issuer: appConfig.mfa.otp.issuer,
|
|
label: account,
|
|
algorithm: "SHA1",
|
|
digits: 6,
|
|
period: 30,
|
|
secret: otpsecret
|
|
});
|
|
|
|
qrcode.toDataURL(totp.toString(), (error, url) => {
|
|
resolve(url)
|
|
})
|
|
})
|
|
}
|
|
|
|
export function validateOTPCode(account, otpsecret, token) {
|
|
return new Promise((resolve, reject) => {
|
|
let totp = new TOTP({
|
|
issuer: appConfig.mfa.otp.issuer,
|
|
label: account,
|
|
algorithm: "SHA1",
|
|
digits: 6,
|
|
period: 30,
|
|
secret: otpsecret
|
|
});
|
|
|
|
resolve(totp.validate({ token, window: 2 }));
|
|
});
|
|
}
|
|
|
|
export async function saveOTPSecret(userid, otpsecret) {
|
|
setOTPSecret(userid, otpsecret)
|
|
} |