Update various configuration files, components, and assets; enhance notification system and API endpoints; improve documentation and styles across the application.
This commit is contained in:
109
server/middleware/auth.js
Normal file
109
server/middleware/auth.js
Normal file
@@ -0,0 +1,109 @@
|
||||
import jwt from "jsonwebtoken";
|
||||
|
||||
const ENV = useRuntimeConfig();
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
const cookies = event.req.headers.cookie;
|
||||
if (!cookies) throw new Error("Cookie not found");
|
||||
|
||||
let { accessToken, refreshToken, user } = parseCookie(cookies);
|
||||
|
||||
if (!accessToken) accessToken = null;
|
||||
if (!refreshToken) refreshToken = null;
|
||||
|
||||
let { subdomain } = JSON.parse(user);
|
||||
if (!subdomain) subdomain = null;
|
||||
|
||||
let payloadUser = null;
|
||||
|
||||
payloadUser = verifyAccessToken(accessToken);
|
||||
|
||||
if (!payloadUser) {
|
||||
payloadUser = verifyRefreshToken(refreshToken);
|
||||
if (!payloadUser) throw new Error("Unauthorized Refresh Token");
|
||||
|
||||
const accessToken = generateAccessToken({
|
||||
email: payloadUser.email,
|
||||
roles: payloadUser.roles,
|
||||
});
|
||||
|
||||
// Set new access token
|
||||
event.res.setHeader("Set-Cookie", [
|
||||
`accessToken=${accessToken}; HttpOnly; Secure; SameSite=Lax; Path=/`,
|
||||
]);
|
||||
}
|
||||
|
||||
const getUser = await getUserInfo(payloadUser.username);
|
||||
if (!getUser) throw new Error("User not found");
|
||||
|
||||
event.context.user = {
|
||||
userID: getUser.userID || null,
|
||||
email: payloadUser.email || null,
|
||||
roles: payloadUser.roles || [],
|
||||
};
|
||||
|
||||
return;
|
||||
} catch (error) {
|
||||
// console.log(error.message);
|
||||
event.context.user = {
|
||||
userID: null,
|
||||
email: null,
|
||||
roles: [],
|
||||
};
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
function parseCookie(str) {
|
||||
return str
|
||||
.split(";")
|
||||
.map((v) => v.split("="))
|
||||
.reduce((acc, v) => {
|
||||
acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim());
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
|
||||
function verifyAccessToken(accessToken) {
|
||||
try {
|
||||
const token = ENV.auth.secretAccess;
|
||||
return jwt.verify(accessToken, token);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function verifyRefreshToken(refreshToken) {
|
||||
try {
|
||||
const token = ENV.auth.secretRefresh;
|
||||
return jwt.verify(refreshToken, token);
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function generateAccessToken(user) {
|
||||
try {
|
||||
const token = ENV.auth.secretAccess;
|
||||
return jwt.sign(user, token, { expiresIn: "1d" });
|
||||
} catch (error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function getUserInfo(username) {
|
||||
try {
|
||||
const user = await prisma.user.findFirst({
|
||||
where: {
|
||||
userUsername: username,
|
||||
},
|
||||
});
|
||||
|
||||
if (!user) return null;
|
||||
|
||||
return user;
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user