Skip to content

Commit 47ffa41

Browse files
authored
Merge pull request #1793 from rocket-admin/backend_up_npm_libs
feat: upgrade otplib to version 13.4.0 and refactor OTP handling methods
2 parents e5c9b0f + 6271585 commit 47ffa41

7 files changed

Lines changed: 64 additions & 52 deletions

File tree

backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
"node-sql-parser": "^5.4.0",
8383
"nodemailer": "^8.0.7",
8484
"nunjucks": "^3.2.4",
85-
"otplib": "^12.0.1",
85+
"otplib": "^13.4.0",
8686
"p-queue": "9.3.0",
8787
"pg-connection-string": "^2.13.0",
8888
"qrcode": "^1.5.4",

backend/src/entities/user/use-cases/disable-otp.use.case.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
InternalServerErrorException,
77
NotFoundException,
88
} from '@nestjs/common';
9-
import { authenticator } from 'otplib';
9+
import { verifySync } from 'otplib';
1010
import AbstractUseCase from '../../../common/abstract-use.case.js';
1111
import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js';
1212
import { BaseType } from '../../../common/data-injection.tokens.js';
@@ -41,7 +41,7 @@ export class DisableOtpUseCase extends AbstractUseCase<VerifyOtpDS, OtpDisabling
4141
throw new BadRequestException(Messages.OTP_NOT_ENABLED);
4242
}
4343
try {
44-
const isValid = authenticator.check(otpToken, otpSecretKey);
44+
const isValid = verifySync({ token: otpToken, secret: otpSecretKey }).valid;
4545
if (isValid) {
4646
foundUser.isOTPEnabled = false;
4747
foundUser.otpSecretKey = null;

backend/src/entities/user/use-cases/generate-otp-use.case.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common';
2-
import { authenticator } from 'otplib';
2+
import { generateSecret } from 'otplib';
33
import AbstractUseCase from '../../../common/abstract-use.case.js';
44
import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js';
55
import { BaseType } from '../../../common/data-injection.tokens.js';
@@ -37,7 +37,7 @@ export class GenerateOtpUseCase extends AbstractUseCase<string, OtpSecretDS> imp
3737
);
3838
}
3939

40-
const otpSecretKey = authenticator.generateSecret();
40+
const otpSecretKey = generateSecret();
4141
foundUser.otpSecretKey = otpSecretKey;
4242
await this._dbContext.userRepository.saveUserEntity(foundUser);
4343
const { otpauth, qrCode } = await generateQRCode(foundUser.email, otpSecretKey);

backend/src/entities/user/use-cases/otp-login-use.case.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BadRequestException, Inject, Injectable, NotFoundException } from '@nestjs/common';
2-
import { authenticator } from 'otplib';
2+
import { verifySync } from 'otplib';
33
import AbstractUseCase from '../../../common/abstract-use.case.js';
44
import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js';
55
import { BaseType } from '../../../common/data-injection.tokens.js';
@@ -28,7 +28,7 @@ export class OtpLoginUseCase extends AbstractUseCase<VerifyOtpDS, IToken> implem
2828
if (!foundUser) {
2929
throw new NotFoundException(Messages.USER_NOT_FOUND);
3030
}
31-
const isValid = authenticator.check(otpToken, foundUser.otpSecretKey);
31+
const isValid = verifySync({ token: otpToken, secret: foundUser.otpSecretKey }).valid;
3232
if (!isValid) {
3333
await this.recordSignInAudit(
3434
foundUser.email,

backend/src/entities/user/use-cases/verify-otp-use.case.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common';
2-
import { authenticator } from 'otplib';
2+
import { verifySync } from 'otplib';
33
import AbstractUseCase from '../../../common/abstract-use.case.js';
44
import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js';
55
import { BaseType } from '../../../common/data-injection.tokens.js';
@@ -48,7 +48,7 @@ export class VerifyOtpUseCase extends AbstractUseCase<VerifyOtpDS, OtpValidation
4848
);
4949
}
5050
try {
51-
const isValid = authenticator.check(otpToken, otpSecretKey);
51+
const isValid = verifySync({ token: otpToken, secret: otpSecretKey }).valid;
5252
if (isValid) {
5353
foundUser.isOTPEnabled = true;
5454
await this._dbContext.userRepository.saveUserEntity(foundUser);
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { authenticator } from 'otplib';
1+
import { generateURI } from 'otplib';
22
import QRCode from 'qrcode';
33

44
export async function generateQRCode(userEmail: string, secretKey: string) {
55
const service = 'Rocketadmin';
6-
const otpauth = authenticator.keyuri(userEmail, service, secretKey);
6+
const otpauth = generateURI({ issuer: service, label: userEmail, secret: secretKey });
77
const qrCode = await QRCode.toDataURL(otpauth);
88
return { qrCode, otpauth };
99
}

pnpm-lock.yaml

Lines changed: 53 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)