plugable-authentication
Version:
The PlugableAuthentication module offers middleware functions for various authentication tasks within Node.js applications, particularly in conjunction with Express.js.
320 lines (285 loc) • 8.59 kB
JavaScript
require("dotenv").config();
const mongoose = require("mongoose");
const { PlugableAuthentication } = require("../index");
const mongoUri = process.env.MONGO_TEST_URI;
const mongoConfig = async () => {
try {
if (!mongoUri) throw new Error("No Mongo URI Found");
await mongoose.connect(mongoUri);
console.log("Connected to Mongo DB");
} catch (e) {
console.error("Failed to connect to Mongo DB", err);
}
};
mongoConfig();
const cookieStoreConnection = () => {
const cookieStoreSchema = new mongoose.Schema(
{
cookieName: String,
cookieValue: String,
},
{ timestamps: true }
);
const CookieStore = mongoose.model("cookieStore", cookieStoreSchema);
const addCookieToStore = async (cookieName, cookieValue) => {
const data = await CookieStore.findOneAndUpdate(
{ cookieName },
{ cookieValue },
{ lean: true, new: true, upsert: true }
).exec();
return { cookieName: data.cookieName, cookieValue: data.cookieValue };
};
const getCookieValueFrmStore = async (cookieName) => {
const data = await CookieStore.findOne({ cookieName }, null, {
lean: true,
}).exec();
return { cookieName: data.cookieName, cookieValue: data.cookieValue };
};
const getAllCookiesFrmStore = async () => {
const datas = await CookieStore.find().exec();
const dataObject = datas.reduce((prev, curnt) => {
prev[curnt.cookieName] = curnt.cookieValue;
return prev;
}, {});
return dataObject;
};
return { addCookieToStore, getCookieValueFrmStore, getAllCookiesFrmStore };
};
const { addCookieToStore, getCookieValueFrmStore, getAllCookiesFrmStore } =
cookieStoreConnection();
const paInstanceCreator = (options) => {
const paInstance = new PlugableAuthentication(options);
return paInstance;
};
// module.exports.mongoConfig = mongoConfig;
module.exports.emptyPaInstanceCreator = () => {
return paInstanceCreator();
};
module.exports.withOptionsPaInstanceCreator = (options) => {
return function () {
return paInstanceCreator(options);
};
};
module.exports.paOptions = {
uri: process.env.MONGO_TEST_URI,
collectionName: process.env.MONGO_TEST_COLLECTION_NAME,
jwtSecret: process.env.JWT_TEST_SECRET_KEY,
encryptSecret: process.env.TEST_ENCRYPTION_SECRET_KEY,
cookieId: process.env.TEST_COOKIE_ID,
};
module.exports.extraPaOptions = {
authKeyName: "username",
disableEmailValidation: true,
authKeyValidationName: 'user name like "abc_dhe45" required',
authKeyValidationPattern: "^[a-zA-Z0-9]+_[a-zA-Z0-9]+$",
};
module.exports.paOptionsForOtp = {
disablePasswordValidation: true,
// passwordValidationPattern: '^[0-9]{6}$',
// passwordValidationName: 'otp must be 6 digits long',
};
module.exports.paOptionsForPhone = {
authKeyName: "phoneNumber",
disableEmailValidation: true,
authKeyValidationName: 'Phone like "+11234567890" is required',
authKeyValidationPattern: "^\\+[0-9]{11}$",
disablePasswordValidation: true,
};
module.exports.requestMethod = {
get: "get",
post: "post",
};
/**
* @param {object} details
* @param {string} [details.userIp]
* @param {string} [details.csrfToken]
* @param {boolean} [details.disableUserCookie]
*/
module.exports.dummyExpress = (details) => {
const { userIp, csrfToken, disableUserCookie = false } = details || {};
const csrfTokenMaybe =
!!csrfToken && typeof csrfToken === "string"
? { "x-csrf-token": csrfToken }
: {};
const request = {
ip:
typeof userIp === "string" && userIp
? userIp
: process.env.TEST_USER_IP1,
headers: { "user-agent": "dummy", ...csrfTokenMaybe },
getUser() {
return this.user;
},
getUserCsrfToken() {
return this.getUserCsrfToken;
},
getValidationToken() {
return this.validationToken;
},
getTokenExpiryTime() {
return this.tokenExpiresIn;
},
},
response = {
__statusCode: 200,
__msg: "",
__cookieName: "",
cookie(cookieName, details) {
this.__cookieName = cookieName;
addCookieToStore(
cookieName,
typeof details === "string" ? details : JSON.stringify(details)
);
},
clearCookie(cookieName) {
this.__cookieName = undefined;
addCookieToStore(cookieName, undefined);
},
status(statusCode) {
this.__statusCode = statusCode;
return this;
},
send(msg) {
this.__msg = msg;
},
getCookieName() {
return this.__cookieName;
},
getResponseStatus() {
if (this.__statusCode !== 200) {
const err = new Error();
err.status = this.__statusCode;
err.message = this.__msg;
console.log("Response status msg:", this.__msg);
throw err;
}
return "ok";
},
};
const next = () => {
console.log("calling next handler");
};
return {
getResponseStatus() {
return response.getResponseStatus();
},
getCookieName() {
return response.getCookieName();
},
getUserDetails() {
return request.getUser();
},
getValidationToken() {
return request.getValidationToken();
},
getTokenExpiryTime() {
return request.getTokenExpiryTime();
},
getUserCsrfToken() {
return request.getUserCsrfToken();
},
postHandler(middlewareCb, requestData) {
if (typeof middlewareCb !== "function") {
throw new Error("Callback function is required.");
}
return async (...args) => {
const func = middlewareCb(...args);
request.body = { ...requestData };
const cookieStore = await (disableUserCookie
? Promise.resolve({})
: getAllCookiesFrmStore());
request.cookies = { ...cookieStore };
return func(request, response, next);
};
},
getHandler(middlewareCb, requestData) {
if (typeof middlewareCb !== "function") {
throw new Error("Callback function is required.");
}
return async (...args) => {
const cookieStore = await getAllCookiesFrmStore();
const func = middlewareCb(...args);
request.query = { ...requestData };
request.cookies = { ...cookieStore };
return func(request, response, next);
};
},
};
return;
};
module.exports.getCookieStoreValue = async (cookieName) => {
const data = await getCookieValueFrmStore(cookieName);
return data.cookieValue;
};
module.exports.getTestUserEmailPwdCredential = () => {
return {
email: process.env.TEST_USER_EMAIL,
password: process.env.TEST_USER_PWD,
};
};
module.exports.getTestUserNamePwdCredential = () => {
return {
username: process.env.TEST_USER_NAME,
password: process.env.TEST_USER_PWD,
};
};
module.exports.getRandomeDigitOfLen = (len = 6) => {
let digit = "";
while (digit.length < len) {
const randNumstr = Math.random().toString().substring(2).trim();
digit += randNumstr;
}
return digit.substring(0, len);
};
module.exports.getTestUserEmailOtpCredential = () => {
return {
email: process.env.TEST_USER_EMAIL_FOR_OTP,
otp: process.env.TEST_USER_EMAIL_OTP,
};
};
module.exports.getTestUserPhoneOtpCredential = () => {
return {
phoneNumber: process.env.TEST_USER_PHONE_FOR_OTP,
otp: process.env.TEST_USER_PHONE_OTP,
};
};
module.exports.getTestUserPhoneOtpCredential2 = () => {
return {
phoneNumber: process.env.TEST_USER_PHONE_FOR_OTP2,
};
};
module.exports.getFailedTestUserNamePwdCredential = () => {
return {
username: process.env.TEST_USER_FAILED_NAME,
password: process.env.TEST_USER_PWD,
};
};
/**
* @param {string} fileName
*/
module.exports.isSingleTestFileExceutionMatchFile = (fileName) => {
const args = process.argv.slice(2);
const isSingleTestFileExceution = args.some((arg) => arg.includes("grep"));
if (!isSingleTestFileExceution) return true;
return args.some((arg) => fileName.includes(arg));
};
module.exports.userIpAddress = {
ip1: process.env.TEST_USER_IP1,
ip2: process.env.TEST_USER_IP2,
};
module.exports.userCsrfToken = {
csrfToken1: process.env.TEST_USER_CSRF_TOKEN1,
};
module.exports.userPwd = {
pwd1: process.env.TEST_USER_PWD1,
pwd2: process.env.TEST_USER_PWD2,
};
module.exports.disablePaOptions = {
disableCSRFTokenValidation: true,
disableIpMismatchValidation: true,
};
module.exports.delayPromise = (time = 1000) => {
return new Promise((resolve, reject) => {
setInterval(resolve, time);
});
};