otp-process
Version:
This package is created for generating otp login system on the server without using database and to verify the otp also it's just a layer of abstraction on the piece of code.
90 lines (74 loc) • 3.31 kB
JavaScript
const crypto = require('crypto');
const {generateMinMax , hashOtp , compare} = require('./helpers');
class OtpSystem {
// this function will be used to do otp generation process
createOtp(digit = 4, data = {}, expiry = 1, secret = "None") {
// validation 1
if(!Number.isInteger(digit)){
return { error: "digit should be a integer", flag: false };
}else if (!Number.isInteger(expiry)){
return { error: "expiry should be a integer", flag: false };
}
// validating digit 2
if (digit < 4) {
return { error: "digit should be atleast 4", flag: false };
} else if (digit > 12) {
return { error: "digit should be less than 13", flag: false };
} else {
// holding min max for deciding otp length
const length = generateMinMax(digit);
// creating otp
const otp = crypto.randomInt(Number(length.min), Number(length.max));
// creating otp hash
// this is total time
const expiryTime = 1000 * 60 * expiry;
// this is expires time
const expires = Date.now() + expiryTime;
// creating data string encrypting data
let dataString = `${otp}.${expires}.`;
for (let item in data) {
dataString = dataString + data[item] + ".";
};
// purify the dataString
dataString = dataString.substring(0, dataString.length - 1);
// this is the secret for creating otp hash
const SECRET = secret;
// creating otp hash
const otp_hash = hashOtp(dataString, SECRET);
return { error: false, otp, flag: true, data, hash: `${otp_hash}.${expires}` };
}
};
verify(hash, data={}, otp, secret = "None") {
// validating
if (!hash || !data || !otp) {
return { error: "All fields are required", flag: false };
}
// validation 2
if(!Number.isInteger(Number(otp))){
return { error: "otp should be a integer", flag: false };
}
// destructuring hash data
const [hashedOtp, expires] = hash.split(".");
// Checking here, Is entered otp expired or not?
if (Date.now() > Number(expires)) {
// console.log({ "msg": "Otp has been expired", flag: false });
return { error: "otp has expired", flag: false };
};
// this is the data for creating otp hash
let dataString = `${otp}.${expires}.`;
for (let item in data) {
dataString = dataString + data[item] + ".";
};
// purify the dataString
dataString = dataString.substring(0, dataString.length - 1);
// this is the secret for creating otp hash
const SECRET = secret;
// user will be verified or not
const verifyingUser = compare(dataString, SECRET, hashedOtp);
if(!verifyingUser){
return {error:"Otp verification failed, please enter valid details" , flag:false};
}
return {error : false , data , flag:"Otp verified"};
}
}
module.exports = new OtpSystem();