update: routes

This commit is contained in:
2025-09-26 11:06:04 +07:00
parent 7b2509ffa1
commit c0aca9ea87
5 changed files with 187 additions and 75 deletions

8
utils/captcha.js Normal file
View File

@@ -0,0 +1,8 @@
const svgCaptcha = require('svg-captcha');
function createCaptcha() {
const captcha = svgCaptcha.create({ size: 5, noise: 2, color: true });
return { svg: captcha.data, text: captcha.text };
}
module.exports = { createCaptcha };

81
utils/jwt.js Normal file
View File

@@ -0,0 +1,81 @@
const jwt = require('jsonwebtoken');
const crypto = require('crypto');
const tokenSettings = {
access: {
expiresIn: '15m',
type: 'access',
secret: process.env.SECRET
},
refresh: {
expiresIn: '7d',
type: 'refresh',
secret: process.env.REFRESH_SECRET
}
};
function generateTokenId() {
return crypto.randomBytes(32).toString('hex');
}
function generateToken(payload, type) {
const settings = tokenSettings[type];
if (!settings) throw new Error(`Invalid token type: ${type}`);
const tokenPayload = { ...payload, type: settings.type };
return jwt.sign(tokenPayload, settings.secret, {
expiresIn: settings.expiresIn,
jwtid: generateTokenId()
});
}
function verifyTokenType(token, type) {
const settings = tokenSettings[type];
try {
const decoded = jwt.verify(token, settings.secret);
if (decoded.type !== type) throw new Error('Invalid token type');
return decoded;
} catch (error) {
if (error.name === 'TokenExpiredError') throw new Error(`${type} token has expired`);
if (error.name === 'JsonWebTokenError') throw new Error(`Invalid ${type} token`);
throw error;
}
}
function generateAccessToken(payload) {
return generateToken(payload, 'access');
}
function generateRefreshToken(payload) {
return generateToken(payload, 'refresh');
}
function verifyToken(token) {
return verifyTokenType(token, 'access');
}
function verifyRefreshToken(token) {
return verifyTokenType(token, 'refresh');
}
function generateTokenPair(payload) {
const accessToken = generateAccessToken(payload);
const refreshToken = generateRefreshToken(payload);
return {
accessToken,
refreshToken,
tokenType: 'Bearer',
expiresIn: 900,
refreshExpiresIn: 604800
};
}
module.exports = {
generateAccessToken,
generateRefreshToken,
verifyToken,
verifyRefreshToken,
generateTokenPair,
};