Skip to content

Commit

Permalink
fix(redis_auth): authed using redis successfully
Browse files Browse the repository at this point in the history
fixing #67
  • Loading branch information
roman-ojha committed Jun 8, 2022
1 parent a24edd4 commit d536397
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 32 deletions.
99 changes: 68 additions & 31 deletions middleware/auth/authUsingRedis.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import UserDetail from "../../models/userDetail_model.js";
import redis, { RedisClientType } from "redis";
import redis from "redis";
import { RequestHandler, Request, Response, NextFunction } from "express";
import jwt from "jsonwebtoken";
import ExtendJWTPayload from "../../types/jsonwebtoken/extend-jwt-payload.js";
import ResponseObject from "../../interface/responseObject.js";
import RedisUserDetail from "../../interface/redisUserDetail.js";

const REDIS_PORT = process.env.REDIS_PORT || 6379;
let isRedisConnected: boolean = false;
Expand Down Expand Up @@ -32,48 +33,84 @@ const authenticate: RequestHandler = async (
) => {
try {
const token = req.cookies.AuthToken;
if (!token) {
return res.status(401).send(<ResponseObject>{
success: false,
msg: "UnAuthorized: no token provided, please login first",
});
}
const verifyToken = jwt.verify(
token,
process.env.SECRET_KEY!
) as ExtendJWTPayload;
console.log(isRedisConnected);
const userFromRedis = await redisClient.get(verifyToken.id);
// .then((data) => {
// console.log(data);
// })
// .catch((err) => {
// console.log(err);
// });
if (userFromRedis === null) {
// next();
const getUser = await UserDetail.findOne(
{
id: verifyToken.id,
"tokens.token": token,
},
// filtering to get only data that is need when page load
{
userID: 1,
name: 1,
id: 1,
email: 1,
_id: 0,
if (isRedisConnected) {
if (!verifyToken.id) {
return res.status(401).send(<ResponseObject>{
success: false,
msg: "UnAuthorized: no a valid token, please login first",
});
}
const userFromRedis = await redisClient.get(verifyToken.id);
if (userFromRedis === null) {
const getUser = await UserDetail.findOne(
{
id: verifyToken.id,
"tokens.token": token,
},
{
userID: 1,
name: 1,
id: 1,
email: 1,
tokens: { $slice: -5 },
_id: 0,
}
);
if (!getUser) {
return res.status(401).send(<ResponseObject>{
success: false,
msg: "User not found, sorry not a valid token",
});
}
);
if (!getUser) {
req.token = token;
req.rootUser = getUser;
req.userID = getUser.userID;
// Store into redis if user is not available in redis
const redisUserDetail: RedisUserDetail = {
id: getUser.id,
email: getUser.email,
name: getUser.name,
tokens: getUser.tokens,
userID: getUser.userID,
};
await redisClient.setEx(
getUser.id,
864000,
// for 10 days
JSON.stringify(redisUserDetail)
);
next();
return;
}
// User Exist in Redis
// console.log(JSON.parse(userFromRedis));
const parsedUserDetail: RedisUserDetail = JSON.parse(userFromRedis);
const isTokenExist = parsedUserDetail.tokens.find((obj) => {
if (obj.token === token) return true;
});
if (!isTokenExist) {
return res.status(401).send(<ResponseObject>{
success: false,
msg: "User not found, sorry not a valid token",
msg: "Session is expired please login in again",
});
}
req.token = token;
req.rootUser = getUser;
req.userID = getUser.userID;
req.rootUser = parsedUserDetail;
req.userID = parsedUserDetail.userID;
next();
return;
} else {
// redis is not connected
}
// console.log(JSON.parse(userFromRedis));
next();
} catch (err) {}
};

Expand Down
2 changes: 1 addition & 1 deletion routes/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const userRoute = express.Router();
userRoute.get(
"/index",
authenticateWitRedis,
authenticate,
// authenticate,
userController.main
);

Expand Down

0 comments on commit d536397

Please sign in to comment.