chore: compelet refresh token mechanism
This commit is contained in:
@@ -5,7 +5,6 @@ import dayjs from "dayjs";
|
||||
|
||||
import { AuthMessage } from "../../../common/enums/message.enum";
|
||||
import { User } from "../../users/entities/user.entity";
|
||||
import { UsersService } from "../../users/providers/users.service";
|
||||
import { RefreshTokensRepository } from "../../users/repositories/refresh-token.repository";
|
||||
import { ITokenPayload } from "../interfaces/IToken-payload";
|
||||
|
||||
@@ -15,7 +14,6 @@ export class TokensService {
|
||||
private readonly configService: ConfigService,
|
||||
private readonly jwtService: JwtService,
|
||||
private readonly refreshTokensRepository: RefreshTokensRepository,
|
||||
private readonly usersService: UsersService,
|
||||
) {}
|
||||
// ----------- generate token -----------------
|
||||
|
||||
@@ -33,7 +31,7 @@ export class TokensService {
|
||||
const accessExpire = this.configService.getOrThrow<number>("ACCESS_TOKEN_EXPIRE");
|
||||
const refreshExpire = this.configService.getOrThrow<number>("REFRESH_TOKEN_EXPIRE");
|
||||
|
||||
const accessToken = this.jwtService.sign(payload, { expiresIn: `${accessExpire}h` });
|
||||
const accessToken = this.jwtService.sign(payload, { expiresIn: `${accessExpire}m` });
|
||||
|
||||
const refreshToken = this.jwtService.sign(payload, { expiresIn: `${refreshExpire}d` });
|
||||
|
||||
@@ -48,30 +46,41 @@ export class TokensService {
|
||||
//**************************************************************** */
|
||||
async storeRefreshToken(userId: string, refreshToken: string) {
|
||||
const refreshExpire = this.configService.getOrThrow<number>("REFRESH_TOKEN_EXPIRE");
|
||||
|
||||
const expiresAt = dayjs().add(refreshExpire, "day").toDate();
|
||||
|
||||
const token = this.refreshTokensRepository.create({
|
||||
token: refreshToken,
|
||||
user: { id: userId },
|
||||
expiresAt,
|
||||
const existingToken = await this.refreshTokensRepository.findOne({
|
||||
where: { user: { id: userId } },
|
||||
});
|
||||
|
||||
await this.refreshTokensRepository.save(token);
|
||||
if (existingToken) {
|
||||
existingToken.token = refreshToken;
|
||||
existingToken.expiresAt = expiresAt;
|
||||
await this.refreshTokensRepository.save(existingToken);
|
||||
} else {
|
||||
const token = this.refreshTokensRepository.create({
|
||||
token: refreshToken,
|
||||
user: { id: userId },
|
||||
expiresAt,
|
||||
});
|
||||
|
||||
await this.refreshTokensRepository.save(token);
|
||||
}
|
||||
}
|
||||
/************************************************************ */
|
||||
|
||||
async refreshToken(oldRefreshToken: string) {
|
||||
const token = await this.refreshTokensRepository.findOne({ where: { token: oldRefreshToken }, relations: { user: true } });
|
||||
const token = await this.refreshTokensRepository.findOne({
|
||||
where: { token: oldRefreshToken },
|
||||
relations: { user: { roles: { permissions: true } } },
|
||||
});
|
||||
|
||||
if (!token) throw new UnauthorizedException(AuthMessage.INVALID_REFRESH_TOKEN);
|
||||
|
||||
if (dayjs(token.expiresAt).isBefore(dayjs())) throw new UnauthorizedException(AuthMessage.REFRESH_TOKEN_EXPIRED);
|
||||
|
||||
const { user } = await this.usersService.findOneById(token.user.id);
|
||||
await this.refreshTokensRepository.delete({ id: token.id });
|
||||
|
||||
return await this.generateTokens(user);
|
||||
return await this.generateTokens(token.user);
|
||||
}
|
||||
/************************************************************ */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user