login-auth-services
Version:
Authentication services for Google, GitHub, Microsoft, okta and multi-factor authentication using OTP.
90 lines (89 loc) • 4.34 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateOTP = exports.initiateLoginWithEmail = exports.loginUser = exports.registerUser = exports.generateToken = exports.validatePassword = exports.hashPassword = void 0;
const bcrypt_1 = __importDefault(require("bcrypt"));
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
const nodemailer_1 = __importDefault(require("nodemailer"));
const crypto_1 = __importDefault(require("crypto"));
const databaseService_1 = require("./databaseService");
const dbService = databaseService_1.DatabaseService.getInstance();
const OTPs = {};
const transporter = nodemailer_1.default.createTransport({
service: "gmail",
auth: {
user: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASSWORD,
},
});
const hashPassword = (password, saltRounds = 10) => __awaiter(void 0, void 0, void 0, function* () {
const salt = yield bcrypt_1.default.genSalt(saltRounds);
return yield bcrypt_1.default.hash(password, salt);
});
exports.hashPassword = hashPassword;
const validatePassword = (password, hashedPassword) => __awaiter(void 0, void 0, void 0, function* () {
return yield bcrypt_1.default.compare(password, hashedPassword);
});
exports.validatePassword = validatePassword;
const generateToken = (userId, email) => {
const payload = { id: userId, email };
return jsonwebtoken_1.default.sign(payload, process.env.SECRET_KEY || "default_secret_key", { expiresIn: "1h" });
};
exports.generateToken = generateToken;
const registerUser = (username, email, password) => __awaiter(void 0, void 0, void 0, function* () {
const existingUser = yield dbService.findUserByEmail(email);
if (existingUser) {
throw new Error("User already exists");
}
const hashedPassword = yield (0, exports.hashPassword)(password);
return yield dbService.createUser({ username, email, password: hashedPassword });
});
exports.registerUser = registerUser;
const loginUser = (email, password) => __awaiter(void 0, void 0, void 0, function* () {
const user = yield dbService.findUserByEmail(email);
if (user && (yield (0, exports.validatePassword)(password, user.password))) {
const token = (0, exports.generateToken)(user.id, user.email);
return { user, token };
}
return null;
});
exports.loginUser = loginUser;
const initiateLoginWithEmail = (email) => __awaiter(void 0, void 0, void 0, function* () {
const user = yield dbService.findUserByEmail(email);
if (user) {
const otp = crypto_1.default.randomInt(100000, 999999).toString();
OTPs[email] = otp;
yield transporter.sendMail({
from: process.env.EMAIL_USER,
to: email,
subject: "Your OTP for Login",
text: `Your OTP is: ${otp}`,
});
return { message: "OTP sent to your email", success: true };
}
return { message: "User not found", success: false };
});
exports.initiateLoginWithEmail = initiateLoginWithEmail;
const validateOTP = (email, otp) => __awaiter(void 0, void 0, void 0, function* () {
if (OTPs[email] === otp) {
delete OTPs[email];
const user = yield dbService.findUserByEmail(email);
if (user) {
const token = (0, exports.generateToken)(user.id, user.email);
return { user, token };
}
}
return null;
});
exports.validateOTP = validateOTP;