You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.4 KiB
JavaScript

import jwt from 'jsonwebtoken';
import config from "config";
import Token from '../models/Token.js';
class TokenService {
generateTokens(payload) {
const accessToken = jwt.sign(payload, config.get("JWTAccessSecret"), {expiresIn: "30m"});
const refreshToken = jwt.sign(payload, config.get("JWTRefreshSecret"), {expiresIn: "30d"});
return { accessToken, refreshToken }
}
validateAccessToken(token) {
try {
const user = jwt.verify(token, config.get("JWTAccessSecret"))
return user;
} catch (e) {
return null;
}
}
validateRefreshToken(token) {
try {
const user = jwt.verify(token, config.get("JWTRefreshSecret"))
return user;
} catch (e) {
return null;
}
}
async saveToken(userId, refreshToken) {
const candidate = await Token.findOne({ user: userId });
if (candidate) {
candidate.refreshToken = refreshToken;
return candidate.save();
}
const token = await Token.create({ user: userId, refreshToken });
return token;
}
async removeToken(refreshToken) {
const deletedToken = await Token.deleteOne({ refreshToken });
return deletedToken;
}
async findToken(refreshToken) {
const token = await Token.findOne({ refreshToken });
return token;
}
}
export default new TokenService();