168 lines
3.6 KiB
TypeScript
168 lines
3.6 KiB
TypeScript
import { PrismaClient } from '@prisma/client';
|
|
import jwt, { JwtPayload } from "jsonwebtoken";
|
|
import moment from "moment";
|
|
import config from "../../../config/config";
|
|
|
|
export class TokenService {
|
|
constructor(private prisma: PrismaClient) { }
|
|
|
|
private generateToken(
|
|
user_xid: number,
|
|
expiresIn: Date,
|
|
type: string,
|
|
secret: string
|
|
): { token: string; expires: Date } {
|
|
const token = jwt.sign(
|
|
{
|
|
sub: user_xid,
|
|
iat: moment().unix(),
|
|
exp: moment(expiresIn).unix(),
|
|
type,
|
|
},
|
|
secret
|
|
);
|
|
|
|
return { token, expires: expiresIn };
|
|
}
|
|
|
|
async generateAuthToken(
|
|
user_xid: number,
|
|
): Promise<{
|
|
access: { token: string; expires: Date };
|
|
refresh: { token: string; expires: Date };
|
|
}> {
|
|
const accessTokenExpires = moment()
|
|
.add(config.jwt.accessExpirationMinutes, "minutes")
|
|
.toDate();
|
|
|
|
const refreshTokenExpires = moment()
|
|
.add(config.jwt.refreshExpirationDays, "days")
|
|
.toDate();
|
|
|
|
const accessToken = this.generateToken(
|
|
user_xid,
|
|
accessTokenExpires,
|
|
"access",
|
|
config.jwt.secret
|
|
);
|
|
|
|
const refreshToken = this.generateToken(
|
|
user_xid,
|
|
refreshTokenExpires,
|
|
"refresh",
|
|
config.jwt.secret
|
|
);
|
|
|
|
await this.prisma.token.deleteMany({
|
|
where: { userXid: user_xid }
|
|
})
|
|
|
|
await this.prisma.token.create({
|
|
data: {
|
|
token: refreshToken.token,
|
|
expiringAt: refreshToken.expires,
|
|
tokenType: "refresh",
|
|
isBlackListed: false,
|
|
|
|
user: {
|
|
connect: { id: user_xid },
|
|
},
|
|
},
|
|
});
|
|
|
|
return {
|
|
access: accessToken,
|
|
refresh: refreshToken,
|
|
};
|
|
}
|
|
|
|
async generateAuthTokenAdmin(
|
|
user_xid: number
|
|
): Promise<{
|
|
access: { token: string; expires: Date };
|
|
refresh: { token: string; expires: Date };
|
|
}> {
|
|
const accessTokenExpires = moment()
|
|
.add(config.jwt.accessExpirationMinutes, "minutes")
|
|
.toDate();
|
|
|
|
const refreshTokenExpires = moment()
|
|
.add(config.jwt.refreshExpirationDays, "days")
|
|
.toDate();
|
|
|
|
const accessToken = this.generateToken(
|
|
user_xid,
|
|
accessTokenExpires,
|
|
"access",
|
|
config.jwt.secret
|
|
);
|
|
|
|
const refreshToken = this.generateToken(
|
|
user_xid,
|
|
refreshTokenExpires,
|
|
"refresh",
|
|
config.jwt.secret
|
|
);
|
|
|
|
await this.prisma.token.deleteMany({
|
|
where: { userXid: user_xid }
|
|
})
|
|
|
|
await this.prisma.token.create({
|
|
data: {
|
|
token: refreshToken.token,
|
|
expiringAt: refreshToken.expires,
|
|
tokenType: "refresh",
|
|
isBlackListed: false,
|
|
user: {
|
|
connect: { id: user_xid },
|
|
},
|
|
},
|
|
});
|
|
|
|
return {
|
|
access: accessToken,
|
|
refresh: refreshToken,
|
|
};
|
|
}
|
|
|
|
async revokeToken(user_xid: number, deviceId: string): Promise<boolean> {
|
|
const existingToken = await this.prisma.token.findFirst({
|
|
where: {
|
|
id: user_xid,
|
|
deviceId,
|
|
},
|
|
});
|
|
|
|
if (!existingToken) return false;
|
|
|
|
await this.prisma.token.delete({ where: { id: existingToken.id } });
|
|
return true;
|
|
}
|
|
|
|
async isTokenBlackListed(token: string): Promise<boolean> {
|
|
const existing = await this.prisma.token.findUnique({
|
|
where: { token },
|
|
});
|
|
return existing ? true : false;
|
|
}
|
|
|
|
async verifyRefreshToken(
|
|
token: string
|
|
): Promise<string | JwtPayload | null> {
|
|
try {
|
|
return jwt.verify(token, config.jwt.secret);
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
async decodeToken(token: string): Promise<string | JwtPayload | null> {
|
|
try {
|
|
return jwt.decode(token);
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
}
|