fix: multiple mfa token issues

This commit is contained in:
Piyush Gupta
2025-12-06 16:52:18 +05:30
parent 8b32abaf85
commit 5071fa2f69
5 changed files with 28 additions and 6 deletions

View File

@@ -61,7 +61,8 @@ export const leaveConfirmDefaultMessage =
export enum SessionStorageKeys { export enum SessionStorageKeys {
CLI_TERMINAL_TOKEN = "CLI_TERMINAL_TOKEN", CLI_TERMINAL_TOKEN = "CLI_TERMINAL_TOKEN",
ORG_LOGIN_SUCCESS_REDIRECT_URL = "ORG_LOGIN_SUCCESS_REDIRECT_URL", ORG_LOGIN_SUCCESS_REDIRECT_URL = "ORG_LOGIN_SUCCESS_REDIRECT_URL",
AUTH_CONSENT = "AUTH_CONSENT" AUTH_CONSENT = "AUTH_CONSENT",
MFA_TEMP_TOKEN = "MFA_TEMP_TOKEN"
} }
export const secretTagsColors = [ export const secretTagsColors = [

View File

@@ -47,6 +47,7 @@ export const SelectOrganizationSection = () => {
const orgId = queryParams.get("org_id"); const orgId = queryParams.get("org_id");
const callbackPort = queryParams.get("callback_port"); const callbackPort = queryParams.get("callback_port");
const isAdminLogin = queryParams.get("is_admin_login") === "true"; const isAdminLogin = queryParams.get("is_admin_login") === "true";
const mfaPending = queryParams.get("mfa_pending") === "true";
const defaultSelectedOrg = organizations.data?.find((org) => org.id === orgId); const defaultSelectedOrg = organizations.data?.find((org) => org.id === orgId);
const logout = useLogoutUser(true); const logout = useLogoutUser(true);
@@ -236,10 +237,22 @@ export const SelectOrganizationSection = () => {
}, [organizations.isPending, organizations.data]); }, [organizations.isPending, organizations.data]);
useEffect(() => { useEffect(() => {
if (mfaPending && defaultSelectedOrg) {
const storedMfaToken = sessionStorage.getItem(SessionStorageKeys.MFA_TEMP_TOKEN);
if (storedMfaToken) {
sessionStorage.removeItem(SessionStorageKeys.MFA_TEMP_TOKEN);
SecurityClient.setMfaToken(storedMfaToken);
setIsInitialOrgCheckLoading(false);
toggleShowMfa.on();
setMfaSuccessCallback(() => () => handleSelectOrganization(defaultSelectedOrg));
return;
}
}
if (defaultSelectedOrg) { if (defaultSelectedOrg) {
handleSelectOrganization(defaultSelectedOrg); handleSelectOrganization(defaultSelectedOrg);
} }
}, [defaultSelectedOrg]); }, [defaultSelectedOrg, mfaPending]);
if ( if (
userLoading || userLoading ||

View File

@@ -8,7 +8,8 @@ export const SelectOrganizationPageQueryParams = z.object({
org_id: z.string().optional().catch(""), org_id: z.string().optional().catch(""),
callback_port: z.coerce.number().optional().catch(undefined), callback_port: z.coerce.number().optional().catch(undefined),
is_admin_login: z.boolean().optional().catch(false), is_admin_login: z.boolean().optional().catch(false),
force: z.boolean().optional() force: z.boolean().optional(),
mfa_pending: z.boolean().optional().catch(false)
}); });
export const Route = createFileRoute("/_restrict-login-signup/login/select-organization")({ export const Route = createFileRoute("/_restrict-login-signup/login/select-organization")({
@@ -16,7 +17,12 @@ export const Route = createFileRoute("/_restrict-login-signup/login/select-organ
validateSearch: zodValidator(SelectOrganizationPageQueryParams), validateSearch: zodValidator(SelectOrganizationPageQueryParams),
search: { search: {
middlewares: [ middlewares: [
stripSearchParams({ org_id: "", callback_port: undefined, is_admin_login: false }) stripSearchParams({
org_id: "",
callback_port: undefined,
is_admin_login: false,
mfa_pending: false
})
] ]
} }
}); });

View File

@@ -1,6 +1,7 @@
import { createFileRoute, isRedirect, redirect } from "@tanstack/react-router"; import { createFileRoute, isRedirect, redirect } from "@tanstack/react-router";
import SecurityClient from "@app/components/utilities/SecurityClient"; import SecurityClient from "@app/components/utilities/SecurityClient";
import { SessionStorageKeys } from "@app/const";
import { authKeys, fetchAuthToken, selectOrganization } from "@app/hooks/api/auth/queries"; import { authKeys, fetchAuthToken, selectOrganization } from "@app/hooks/api/auth/queries";
import { fetchOrganizationById, organizationKeys } from "@app/hooks/api/organization/queries"; import { fetchOrganizationById, organizationKeys } from "@app/hooks/api/organization/queries";
import { projectKeys } from "@app/hooks/api/projects"; import { projectKeys } from "@app/hooks/api/projects";
@@ -28,9 +29,10 @@ export const Route = createFileRoute("/_authenticate/_inject-org-details")({
const { token, isMfaEnabled } = await selectOrganization({ organizationId: urlOrgId }); const { token, isMfaEnabled } = await selectOrganization({ organizationId: urlOrgId });
if (isMfaEnabled) { if (isMfaEnabled) {
sessionStorage.setItem(SessionStorageKeys.MFA_TEMP_TOKEN, token);
throw redirect({ throw redirect({
to: "/login/select-organization", to: "/login/select-organization",
search: { org_id: urlOrgId } search: { org_id: urlOrgId, mfa_pending: true }
}); });
} }

View File

@@ -242,7 +242,7 @@ export const OrgMembersSection = () => {
isOpen={popUp.addMemberToSubOrg.isOpen} isOpen={popUp.addMemberToSubOrg.isOpen}
onOpenChange={(isOpen) => handlePopUpToggle("addMemberToSubOrg", isOpen)} onOpenChange={(isOpen) => handlePopUpToggle("addMemberToSubOrg", isOpen)}
> >
<ModalContent title="Add member from your organization"> <ModalContent title="Add member from your organization" bodyClassName="overflow-visible">
<AddSubOrgMemberModal onClose={() => handlePopUpClose("addMemberToSubOrg")} /> <AddSubOrgMemberModal onClose={() => handlePopUpClose("addMemberToSubOrg")} />
</ModalContent> </ModalContent>
</Modal> </Modal>