UNPKG

newmax-utils

Version:
117 lines (116 loc) 4.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.refreshToken = exports.verifyToken = exports.signToken = void 0; const moment_1 = __importDefault(require("moment")); const jsonwebtoken_1 = __importDefault(require("jsonwebtoken")); const env_1 = require("../configs/env"); const ApiError_1 = require("../ApiError"); const crypto_1 = require("./crypto"); const typeTime = { days: 'd', minutes: 'm', seconds: 's', }; const secretKey = env_1.env.JWT_SECRET_KEY || 'secret_key'; const expiresDays = 30; const healthToken = async (accessToken) => { const decodedToken = jsonwebtoken_1.default.verify(accessToken, secretKey); if (!decodedToken || decodedToken instanceof jsonwebtoken_1.default.JsonWebTokenError) { return false; } return true; }; const signToken = async (data, options) => { if (!typeTime[options.type]) { return { error: { message: 'This time type is not supported', description: `Supported types: ${Object.keys(typeTime).join(', ')}`, }, }; } try { const payload = (0, crypto_1.encryptData)(JSON.stringify(data)); const accessToken = jsonwebtoken_1.default.sign({ payload }, secretKey, { expiresIn: `${options.expiredAt}${typeTime[options.type]}`, }); const refreshToken = jsonwebtoken_1.default.sign({ payload }, secretKey, { expiresIn: `${expiresDays}d`, }); const accessTokenExpired = (0, moment_1.default)().add(options.expiredAt, options.type); const refreshTokenExpired = (0, moment_1.default)().add(expiresDays, 'days'); return { data: { accessToken, refreshToken, accessTokenExpired, refreshTokenExpired, }, }; } catch (e) { return { error: new ApiError_1.ApiError(401, 'Generate accessToken and refreshToken failed') }; } }; exports.signToken = signToken; const verifyToken = async (accessToken) => { try { const data = jsonwebtoken_1.default.verify(accessToken, secretKey); return { data }; } catch (e) { return { error: new ApiError_1.ApiError(401, 'Verified accessToken expired or invalid') }; } }; exports.verifyToken = verifyToken; const refreshToken = async (accessToken, refreshToken, options) => { if (!typeTime[options.type]) { throw new ApiError_1.ApiError(400, 'This time type is not supported', { description: `Supported types: ${Object.keys(typeTime).join(', ')}`, }); } try { let data; if (!accessToken || !refreshToken) { throw new ApiError_1.ApiError(400, 'AccessToken and RefreshToken not found'); } const decodedAccessToken = jsonwebtoken_1.default.decode(accessToken); const decodedRefreshToken = jsonwebtoken_1.default.decode(refreshToken); if (!!healthToken(accessToken)) { const newAccessToken = jsonwebtoken_1.default.sign({ payload: decodedAccessToken.payload }, secretKey, { expiresIn: `${options.expiredAt}${typeTime[options.type]}`, }); const newRefreshToken = jsonwebtoken_1.default.sign({ payload: decodedRefreshToken.payload }, secretKey, { expiresIn: `${expiresDays}d`, }); const accessTokenExpired = (0, moment_1.default)().add(options.expiredAt, options.type); const refreshTokenExpired = (0, moment_1.default)().add(expiresDays, 'days'); data = { status: 'AccessToken and RefreshToken has been updated', accessToken: newAccessToken, refreshToken: newRefreshToken, accessTokenExpired, refreshTokenExpired, }; } else { const accessTokenExpired = (0, moment_1.default)(decodedAccessToken.exp, 'X').format(); const refreshTokenExpired = (0, moment_1.default)(decodedRefreshToken.exp, 'X').format(); data = { status: 'AccessToken and RefreshToken is health. Returned is old tokens', accessToken, refreshToken, accessTokenExpired, refreshTokenExpired, }; } return { data }; } catch (e) { return new ApiError_1.ApiError(401, 'Generate new accessToken and refreshToken failed'); } }; exports.refreshToken = refreshToken;