Untitled
unknown
typescript
2 years ago
3.2 kB
9
Indexable
const sendOtpEmail = async (email: string, otp: string) => {
const transporter = nodemailer.createTransport({
host: "sandbox.smtp.mailtrap.io",
port: 2525,
auth: {
user: "d32056e1316219",
pass: "a560c8049b58d1",
},
});
const mailOptions = {
from: process.env.EMAIL_USERNAME,
to: email,
subject: "OTP for login",
text: `Your OTP for login is ${otp}`,
};
try {
const info = await transporter.sendMail(mailOptions);
console.log("Message sent: %s", info.messageId);
} catch (error) {
console.error("Error sending email:", error);
}
await transporter.sendMail(mailOptions);
};
export const login = async (req: Request, res: Response) => {
const { email, password } = req.body;
if (!email || !password) {
return res.status(400).json({
error: true,
message: REQUIRED_VALUE_EMPTY,
});
}
try {
const user = await Users.findOne({ email });
if (!user || user.deletedAt) {
throw new Error("Account does not exist in our system");
}
if (user.blockedAt) {
throw new Error("Account was prohibited to login due to violations");
}
const decryptPassword = CryptoJS.AES.decrypt(
user.password as string,
encryptKey as string
);
const originalPassword = decryptPassword.toString(CryptoJS.enc.Utf8);
if (originalPassword !== password) {
throw new Error("Email or password is invalid");
}
// Correct password, generate OTP
const otp = Math.floor(100000 + Math.random() * 900000).toString(); // 6-digit OTP
user.otp = otp;
user.otpExpiresAt = new Date(Date.now() + 10 * 60000); // OTP expires in 10 minutes
await user.save();
// Send OTP to user's email
await sendOtpEmail(email, otp);
// Do not send the JWT token now, wait for OTP verification
return res.json({
error: false,
message: "OTP sent to email. Please verify to continue.",
});
} catch (err: any) {
const message = err.message || UNKNOWN_ERROR_OCCURRED;
return res.status(500).json({
error: true,
message: message,
});
}
};
export const verifyOtp = async (req: Request, res: Response) => {
const { email, otp } = req.body;
try {
const user = await Users.findOne({
email,
otp,
otpExpiresAt: { $gt: Date.now() },
});
if (!user) {
res.json({
error: true,
message: "OTP is invalid or expired",
});
} else {
// OTP is correct, and not expired
user.otp = ""; // clear OTP
user.otpExpiresAt = undefined; //clear OTP expiry
await user.save();
}
// Now create the JWT token since OTP is verified
const token = jwt.sign(
{ email: user?.email, role: user?.role },
signKey as string,
{ expiresIn: "1d" }
);
res.json({
error: false,
message: "OTP verified, user logged in successfully",
item: token,
itemCount: null,
});
} catch (error) {
res.json({
error: true,
message: String(error),
items: null,
itemCount: null,
});
}
};Editor is loading...
Leave a Comment