Files
crm.stream.graff.tech/server/src/routes/refresh.ts
T
2024-10-28 16:16:53 +05:00

84 lines
2.1 KiB
TypeScript

import { createSecretKey } from "crypto";
import { Router } from "express";
import { jwtVerify, SignJWT } from "jose";
import Token from "../models/Token.js";
import User from "../models/User.js";
import IToken from "../types/IToken.js";
const router = Router();
router.post("/", async (req, res) => {
let _username;
if (req.cookies.refreshToken) {
try {
const {
payload: { username },
} = await jwtVerify(
req.cookies.refreshToken,
createSecretKey(process.env.JWT_SECRET!, "utf8")
);
_username = username;
} catch (error) {
return res.json({
error: `refreshToken jwtVerify - ${(error as Error).message}`,
});
}
const userWithTokens = await User.findOne({ username: _username }).populate(
{
path: "tokens",
}
);
if (!userWithTokens) {
return res.json({ error: "userWithTokens is null" });
}
if (!("tokens" in userWithTokens)) {
return res.json({ error: "tokens not found in userWithTokens" });
}
const foundRefreshToken = userWithTokens.tokens as IToken[];
if (
!foundRefreshToken.find(
(token) => token.refreshToken === req.cookies.refreshToken
)?.refreshToken
) {
console.log("refreshToken not found in DB");
return res.json({ error: "refreshToken not found in DB" });
}
const accessToken = await new SignJWT({ username: _username })
.setProtectedHeader({ alg: "HS256" })
.setExpirationTime(process.env.JWT_ACCESS_EXP)
.sign(createSecretKey(process.env.JWT_SECRET!, "utf8"));
await Token.findOneAndUpdate(
{ refreshToken: req.cookies.refreshToken },
{ accessToken }
);
return res.json({ accessToken });
}
// if (req.body.refreshToken) {
// try {
// jwtVerify(
// req.body.refreshToken,
// createSecretKey(process.env.JWT_SECRET!, "utf8")
// );
// } catch (error) {
// return res.json({ error: `refreshToken - ${(error as Error).message}` });
// }
// }
return res.json({ error: "refreshToken not found" });
});
const refreshRoute = router;
export default refreshRoute;