update: routes
This commit is contained in:
8
utils/captcha.js
Normal file
8
utils/captcha.js
Normal 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
81
utils/jwt.js
Normal 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,
|
||||
};
|
||||
Reference in New Issue
Block a user