103 lines
1.6 KiB
JavaScript
103 lines
1.6 KiB
JavaScript
// app/utils/emailVerification.util.js
|
|
|
|
const crypto = require("crypto");
|
|
|
|
const redis = require("../config/redisClient");
|
|
|
|
const EMAIL_VERIFICATION_TTL =
|
|
Number(
|
|
process.env.EMAIL_VERIFICATION_TTL_SECONDS
|
|
) || 1800;
|
|
|
|
const generateEmailVerificationToken = () => {
|
|
return crypto
|
|
.randomBytes(32)
|
|
.toString("hex");
|
|
};
|
|
|
|
const hashEmailVerificationToken = (token) => {
|
|
return crypto
|
|
.createHash("sha256")
|
|
.update(token)
|
|
.digest("hex");
|
|
};
|
|
|
|
const createEmailVerification = async (userId) => {
|
|
|
|
// 1. Generate raw token
|
|
const token =
|
|
generateEmailVerificationToken();
|
|
|
|
|
|
// 2. Hash token
|
|
const tokenHash =
|
|
hashEmailVerificationToken(token);
|
|
|
|
|
|
// 3. Create Redis key
|
|
const redisKey =
|
|
`email-verification:${tokenHash}`;
|
|
|
|
await redis.set(
|
|
redisKey,
|
|
userId,
|
|
"EX",
|
|
EMAIL_VERIFICATION_TTL
|
|
);
|
|
|
|
return token;
|
|
};
|
|
|
|
|
|
/**
|
|
* Check a verification token.
|
|
*/
|
|
const verifyEmailVerificationToken =
|
|
async (token) => {
|
|
|
|
if (
|
|
!token ||
|
|
typeof token !== "string"
|
|
) {
|
|
return null;
|
|
}
|
|
|
|
|
|
// 1. Hash token received from user
|
|
const tokenHash =
|
|
hashEmailVerificationToken(token);
|
|
|
|
|
|
// 2. Build same Redis key
|
|
const redisKey =
|
|
`email-verification:${tokenHash}`;
|
|
|
|
|
|
// 3. Search Redis
|
|
const userId =
|
|
await redis.get(redisKey);
|
|
|
|
if (!userId) {
|
|
return null;
|
|
}
|
|
|
|
|
|
return {
|
|
userId,
|
|
redisKey,
|
|
};
|
|
};
|
|
|
|
const deleteEmailVerification =
|
|
async (redisKey) => {
|
|
|
|
await redis.del(redisKey);
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
createEmailVerification,
|
|
verifyEmailVerificationToken,
|
|
deleteEmailVerification,
|
|
hashEmailVerificationToken,
|
|
}; |