cca-auth-module 0.1.85 → 0.1.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +148 -86
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +148 -86
- package/dist/index.mjs.map +1 -1
- package/dist/presentation/constants/constants.d.ts +24 -0
- package/dist/presentation/controller/AuthController.d.ts +2 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -697,6 +697,32 @@ var _TwoFactorDisableUseCase = class _TwoFactorDisableUseCase {
|
|
|
697
697
|
__name(_TwoFactorDisableUseCase, "TwoFactorDisableUseCase");
|
|
698
698
|
var TwoFactorDisableUseCase = _TwoFactorDisableUseCase;
|
|
699
699
|
|
|
700
|
+
// src/presentation/constants/constants.ts
|
|
701
|
+
var HTTP_STATUS = {
|
|
702
|
+
OK: 200,
|
|
703
|
+
CREATED: 201
|
|
704
|
+
};
|
|
705
|
+
var AUTH_STATUS = {
|
|
706
|
+
BASIC_AUTH: "basic_auth",
|
|
707
|
+
NEEDS_SETUP: "needs_setup",
|
|
708
|
+
PENDING_VERIFICATION: "pending_verification",
|
|
709
|
+
FULL_AUTH: "full_auth",
|
|
710
|
+
LOGGED_OUT: "logged_out",
|
|
711
|
+
REGISTERED: "registered",
|
|
712
|
+
TOKEN_REFRESHED: "token_refreshed"
|
|
713
|
+
};
|
|
714
|
+
var MESSAGES = {
|
|
715
|
+
LOGIN_SUCCESS: "Login successful",
|
|
716
|
+
ADMIN_LOGIN_SUCCESS: "Admin login successful",
|
|
717
|
+
LOGOUT_SUCCESS: "Logged out successfully",
|
|
718
|
+
REGISTER_SUCCESS: "User registered successfully",
|
|
719
|
+
TOKEN_REFRESH_SUCCESS: "Token refreshed successfully",
|
|
720
|
+
TWO_FA_SETUP_SUCCESS: "Two-factor authentication setup initiated",
|
|
721
|
+
TWO_FA_ENABLE_SUCCESS: "Two-factor authentication enabled",
|
|
722
|
+
TWO_FA_VERIFY_SUCCESS: "Two-factor authentication verified successfully",
|
|
723
|
+
TWO_FA_DISABLE_SUCCESS: "Two-factor authentication disabled"
|
|
724
|
+
};
|
|
725
|
+
|
|
700
726
|
// src/presentation/controller/AuthController.ts
|
|
701
727
|
var _AuthController = class _AuthController {
|
|
702
728
|
constructor(loginUseCase, adminLoginUseCase, logoutUseCase, registerUseCase, refreshTokenUseCase, twoFactorSetupUseCase, twoFactorEnableUseCase, twoFactorVerifyUseCase, twoFactorDisableUseCase) {
|
|
@@ -704,19 +730,23 @@ var _AuthController = class _AuthController {
|
|
|
704
730
|
try {
|
|
705
731
|
const loginDTO = req.body;
|
|
706
732
|
const result = await this.loginUseCase.execute(loginDTO);
|
|
707
|
-
const
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
733
|
+
const twoFactorEnabled = result.enabled ?? false;
|
|
734
|
+
const loginData = {
|
|
735
|
+
accessToken: result.accessToken,
|
|
736
|
+
userId: result.id,
|
|
737
|
+
expiresAt: result.expiresAt,
|
|
738
|
+
enabled: twoFactorEnabled,
|
|
739
|
+
auth: this.createAuthData(
|
|
740
|
+
true,
|
|
741
|
+
// hasAccessToken
|
|
742
|
+
twoFactorEnabled,
|
|
743
|
+
// enable (2FA enabled status)
|
|
744
|
+
twoFactorEnabled ? AUTH_STATUS.PENDING_VERIFICATION : AUTH_STATUS.BASIC_AUTH,
|
|
745
|
+
false
|
|
746
|
+
// verified - always false for basic login
|
|
747
|
+
)
|
|
748
|
+
};
|
|
749
|
+
this.sendResponse(res, HTTP_STATUS.OK, MESSAGES.LOGIN_SUCCESS, loginData);
|
|
720
750
|
} catch (error) {
|
|
721
751
|
next(error);
|
|
722
752
|
}
|
|
@@ -728,11 +758,20 @@ var _AuthController = class _AuthController {
|
|
|
728
758
|
throw new ForbiddenError("Admin password is required");
|
|
729
759
|
}
|
|
730
760
|
const result = await this.adminLoginUseCase.execute(loginDTO, adminPassword);
|
|
731
|
-
const
|
|
732
|
-
|
|
733
|
-
result
|
|
734
|
-
|
|
735
|
-
|
|
761
|
+
const adminLoginData = {
|
|
762
|
+
message: result,
|
|
763
|
+
// Assuming result is a string message
|
|
764
|
+
auth: this.createAuthData(
|
|
765
|
+
true,
|
|
766
|
+
// hasAccessToken
|
|
767
|
+
false,
|
|
768
|
+
// enable - assuming 2FA not enabled for admin login
|
|
769
|
+
AUTH_STATUS.BASIC_AUTH,
|
|
770
|
+
false
|
|
771
|
+
// verified
|
|
772
|
+
)
|
|
773
|
+
};
|
|
774
|
+
this.sendResponse(res, HTTP_STATUS.CREATED, MESSAGES.ADMIN_LOGIN_SUCCESS, adminLoginData);
|
|
736
775
|
} catch (error) {
|
|
737
776
|
next(error);
|
|
738
777
|
}
|
|
@@ -740,8 +779,18 @@ var _AuthController = class _AuthController {
|
|
|
740
779
|
this.logout = /* @__PURE__ */ __name(async (req, res, next) => {
|
|
741
780
|
try {
|
|
742
781
|
await this.logoutUseCase.execute(req.body.id);
|
|
743
|
-
const
|
|
744
|
-
|
|
782
|
+
const logoutData = {
|
|
783
|
+
auth: this.createAuthData(
|
|
784
|
+
false,
|
|
785
|
+
// hasAccessToken - no token after logout
|
|
786
|
+
false,
|
|
787
|
+
// enable - 2FA status irrelevant after logout
|
|
788
|
+
AUTH_STATUS.LOGGED_OUT,
|
|
789
|
+
false
|
|
790
|
+
// verified - false after logout
|
|
791
|
+
)
|
|
792
|
+
};
|
|
793
|
+
this.sendResponse(res, HTTP_STATUS.OK, MESSAGES.LOGOUT_SUCCESS, logoutData);
|
|
745
794
|
} catch (error) {
|
|
746
795
|
next(error);
|
|
747
796
|
}
|
|
@@ -750,12 +799,24 @@ var _AuthController = class _AuthController {
|
|
|
750
799
|
try {
|
|
751
800
|
const { email, name, password, role, adminPassword } = req.body;
|
|
752
801
|
await this.registerUseCase.execute(email, name, password, role, adminPassword);
|
|
753
|
-
const
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
802
|
+
const registerData = {
|
|
803
|
+
auth: this.createAuthData(
|
|
804
|
+
false,
|
|
805
|
+
// hasAccessToken - no token after registration
|
|
806
|
+
false,
|
|
807
|
+
// enable - 2FA not enabled for new users
|
|
808
|
+
AUTH_STATUS.REGISTERED,
|
|
809
|
+
false
|
|
810
|
+
// verified - false after registration
|
|
811
|
+
)
|
|
812
|
+
};
|
|
813
|
+
this.sendResponse(
|
|
814
|
+
res,
|
|
815
|
+
HTTP_STATUS.OK,
|
|
816
|
+
MESSAGES.REGISTER_SUCCESS,
|
|
817
|
+
registerData,
|
|
818
|
+
{ status: true }
|
|
757
819
|
);
|
|
758
|
-
res.status(200).json(response);
|
|
759
820
|
} catch (error) {
|
|
760
821
|
next(error);
|
|
761
822
|
}
|
|
@@ -764,11 +825,20 @@ var _AuthController = class _AuthController {
|
|
|
764
825
|
try {
|
|
765
826
|
const { refreshToken } = req.body;
|
|
766
827
|
const result = await this.refreshTokenUseCase.execute(refreshToken);
|
|
767
|
-
|
|
768
|
-
"
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
828
|
+
if (!result) {
|
|
829
|
+
throw new Error("Failed to refresh token");
|
|
830
|
+
}
|
|
831
|
+
const refreshData = {
|
|
832
|
+
accessToken: result.accessToken,
|
|
833
|
+
refreshToken: result.refreshToken,
|
|
834
|
+
auth: this.createAuthData(
|
|
835
|
+
true,
|
|
836
|
+
false,
|
|
837
|
+
AUTH_STATUS.BASIC_AUTH,
|
|
838
|
+
false
|
|
839
|
+
)
|
|
840
|
+
};
|
|
841
|
+
this.sendResponse(res, HTTP_STATUS.OK, MESSAGES.TOKEN_REFRESH_SUCCESS, refreshData);
|
|
772
842
|
} catch (error) {
|
|
773
843
|
next(error);
|
|
774
844
|
}
|
|
@@ -779,18 +849,15 @@ var _AuthController = class _AuthController {
|
|
|
779
849
|
throw new ForbiddenError("User authentication required");
|
|
780
850
|
}
|
|
781
851
|
const result = await this.twoFactorSetupUseCase.execute(req.auth.id);
|
|
782
|
-
const
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
}
|
|
792
|
-
);
|
|
793
|
-
res.status(200).json(response);
|
|
852
|
+
const setupData = {
|
|
853
|
+
qrCode: result.qrCodeUrl,
|
|
854
|
+
auth: this.createAuthData(true, false, AUTH_STATUS.NEEDS_SETUP)
|
|
855
|
+
};
|
|
856
|
+
const meta = {
|
|
857
|
+
nextStep: "Scan the QR code and enter your first code to verify",
|
|
858
|
+
redirectTo: "/2fa-enable"
|
|
859
|
+
};
|
|
860
|
+
this.sendResponse(res, HTTP_STATUS.OK, MESSAGES.TWO_FA_SETUP_SUCCESS, setupData, meta);
|
|
794
861
|
} catch (error) {
|
|
795
862
|
next(error);
|
|
796
863
|
}
|
|
@@ -799,19 +866,16 @@ var _AuthController = class _AuthController {
|
|
|
799
866
|
try {
|
|
800
867
|
const dto = { ...req.body, userId: req.auth?.id };
|
|
801
868
|
await this.twoFactorEnableUseCase.execute(dto);
|
|
802
|
-
const
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
}
|
|
813
|
-
);
|
|
814
|
-
res.status(200).json(response);
|
|
869
|
+
const enableData = {
|
|
870
|
+
isEnabled: true,
|
|
871
|
+
enabledAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
872
|
+
auth: this.createAuthData(true, true, AUTH_STATUS.PENDING_VERIFICATION)
|
|
873
|
+
};
|
|
874
|
+
const meta = {
|
|
875
|
+
nextStep: "Proceed to verify with a valid 2FA token",
|
|
876
|
+
redirectTo: "/verify-2fa"
|
|
877
|
+
};
|
|
878
|
+
this.sendResponse(res, HTTP_STATUS.OK, MESSAGES.TWO_FA_ENABLE_SUCCESS, enableData, meta);
|
|
815
879
|
} catch (error) {
|
|
816
880
|
next(error);
|
|
817
881
|
}
|
|
@@ -820,25 +884,22 @@ var _AuthController = class _AuthController {
|
|
|
820
884
|
try {
|
|
821
885
|
const dto = req.body;
|
|
822
886
|
const result = await this.twoFactorVerifyUseCase.execute(dto);
|
|
823
|
-
const
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
name: result?.data?.name,
|
|
832
|
-
role: result?.data?.role
|
|
833
|
-
},
|
|
834
|
-
auth: this.createAuthData(true, true, "full_auth", true)
|
|
887
|
+
const verifyData = {
|
|
888
|
+
token: result?.token,
|
|
889
|
+
refreshToken: result?.refreshToken,
|
|
890
|
+
user: {
|
|
891
|
+
id: result?.data?.id,
|
|
892
|
+
email: result?.data?.email,
|
|
893
|
+
name: result?.data?.name,
|
|
894
|
+
role: result?.data?.role
|
|
835
895
|
},
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
896
|
+
auth: this.createAuthData(true, true, AUTH_STATUS.FULL_AUTH, true)
|
|
897
|
+
};
|
|
898
|
+
const meta = {
|
|
899
|
+
recommendation: "You're fully authenticated",
|
|
900
|
+
redirectTo: "/"
|
|
901
|
+
};
|
|
902
|
+
this.sendResponse(res, HTTP_STATUS.OK, MESSAGES.TWO_FA_VERIFY_SUCCESS, verifyData, meta);
|
|
842
903
|
} catch (error) {
|
|
843
904
|
next(error);
|
|
844
905
|
}
|
|
@@ -848,18 +909,15 @@ var _AuthController = class _AuthController {
|
|
|
848
909
|
const userId = req.auth.id;
|
|
849
910
|
const dto = req.body;
|
|
850
911
|
await this.twoFactorDisableUseCase.execute(userId, dto);
|
|
851
|
-
const
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
}
|
|
861
|
-
);
|
|
862
|
-
res.status(200).json(response);
|
|
912
|
+
const disableData = {
|
|
913
|
+
disabledAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
914
|
+
auth: this.createAuthData(true, false, AUTH_STATUS.BASIC_AUTH, false)
|
|
915
|
+
};
|
|
916
|
+
const meta = {
|
|
917
|
+
securityNote: "Account now relies only on password. Re-enable 2FA for better security.",
|
|
918
|
+
redirectTo: "/login"
|
|
919
|
+
};
|
|
920
|
+
this.sendResponse(res, HTTP_STATUS.OK, MESSAGES.TWO_FA_DISABLE_SUCCESS, disableData, meta);
|
|
863
921
|
} catch (error) {
|
|
864
922
|
next(error);
|
|
865
923
|
}
|
|
@@ -874,7 +932,7 @@ var _AuthController = class _AuthController {
|
|
|
874
932
|
this.twoFactorVerifyUseCase = twoFactorVerifyUseCase;
|
|
875
933
|
this.twoFactorDisableUseCase = twoFactorDisableUseCase;
|
|
876
934
|
}
|
|
877
|
-
|
|
935
|
+
createResponse(message, data, meta) {
|
|
878
936
|
return {
|
|
879
937
|
success: true,
|
|
880
938
|
message,
|
|
@@ -893,6 +951,10 @@ var _AuthController = class _AuthController {
|
|
|
893
951
|
...verified !== void 0 && { verified }
|
|
894
952
|
};
|
|
895
953
|
}
|
|
954
|
+
sendResponse(res, statusCode, message, data, meta) {
|
|
955
|
+
const response = this.createResponse(message, data, meta);
|
|
956
|
+
res.status(statusCode).json(response);
|
|
957
|
+
}
|
|
896
958
|
};
|
|
897
959
|
__name(_AuthController, "AuthController");
|
|
898
960
|
var AuthController = _AuthController;
|