diff --git a/apps/login/app/(login)/idp/[provider]/success/page.tsx b/apps/login/app/(login)/idp/[provider]/success/page.tsx
index 6aae35bf68b..9d7777c429f 100644
--- a/apps/login/app/(login)/idp/[provider]/success/page.tsx
+++ b/apps/login/app/(login)/idp/[provider]/success/page.tsx
@@ -97,6 +97,7 @@ export default async function Page({
return retrieveIDPIntent(id, token)
.then((resp) => {
const { idpInformation, userId } = resp;
+
if (idpInformation) {
// handle login
if (userId) {
@@ -166,10 +167,14 @@ export default async function Page({
});
} else {
return (
-
-
Register
-
No id and token received!
-
+
+
+
+
Register
+
No id and token received!
+
+
+
);
}
}
diff --git a/apps/login/app/(login)/mfa/page.tsx b/apps/login/app/(login)/mfa/page.tsx
index 99bac281d46..b8a8d4683ac 100644
--- a/apps/login/app/(login)/mfa/page.tsx
+++ b/apps/login/app/(login)/mfa/page.tsx
@@ -77,6 +77,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName}
showDropdown
+ searchParams={searchParams}
>
)}
diff --git a/apps/login/app/(login)/mfa/set/page.tsx b/apps/login/app/(login)/mfa/set/page.tsx
index 647d436fded..1625e9bb62f 100644
--- a/apps/login/app/(login)/mfa/set/page.tsx
+++ b/apps/login/app/(login)/mfa/set/page.tsx
@@ -80,6 +80,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName}
showDropdown
+ searchParams={searchParams}
>
)}
diff --git a/apps/login/app/(login)/otp/[method]/page.tsx b/apps/login/app/(login)/otp/[method]/page.tsx
index 7dd15acf74a..3e1e5bb8401 100644
--- a/apps/login/app/(login)/otp/[method]/page.tsx
+++ b/apps/login/app/(login)/otp/[method]/page.tsx
@@ -1,6 +1,14 @@
-import { getBrandingSettings, getLoginSettings, server } from "#/lib/zitadel";
+import {
+ getBrandingSettings,
+ getLoginSettings,
+ getSession,
+ server,
+} from "#/lib/zitadel";
+import Alert from "#/ui/Alert";
import DynamicTheme from "#/ui/DynamicTheme";
import LoginOTP from "#/ui/LoginOTP";
+import UserAvatar from "#/ui/UserAvatar";
+import { getMostRecentCookieWithLoginname } from "#/utils/cookies";
export default async function Page({
searchParams,
@@ -14,8 +22,21 @@ export default async function Page({
const { method } = params;
+ const { session, token } = await loadSession(loginName, organization);
+
const branding = await getBrandingSettings(server, organization);
+ async function loadSession(loginName?: string, organization?: string) {
+ const recent = await getMostRecentCookieWithLoginname(
+ loginName,
+ organization
+ );
+
+ return getSession(server, recent.id, recent.token).then((response) => {
+ return { session: response?.session, token: recent.token };
+ });
+ }
+
return (
@@ -30,6 +51,24 @@ export default async function Page({
Enter the code you got via your email.
)}
+ {!session && (
+
+
+ Could not get the context of the user. Make sure to enter the
+ username first or provide a loginName as searchParam.
+
+
+ )}
+
+ {session && (
+
+ )}
+
{method && (
)}
diff --git a/apps/login/app/(login)/passkey/add/page.tsx b/apps/login/app/(login)/passkey/add/page.tsx
index 839ac222556..a955c51d6a3 100644
--- a/apps/login/app/(login)/passkey/add/page.tsx
+++ b/apps/login/app/(login)/passkey/add/page.tsx
@@ -45,6 +45,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName}
showDropdown
+ searchParams={searchParams}
>
)}
{description}
diff --git a/apps/login/app/(login)/passkey/login/page.tsx b/apps/login/app/(login)/passkey/login/page.tsx
index 68df9c6da54..3038fe7cb99 100644
--- a/apps/login/app/(login)/passkey/login/page.tsx
+++ b/apps/login/app/(login)/passkey/login/page.tsx
@@ -60,6 +60,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName}
showDropdown
+ searchParams={searchParams}
>
)}
{description}
diff --git a/apps/login/app/(login)/password/page.tsx b/apps/login/app/(login)/password/page.tsx
index 6c422bdbce9..473d46bd993 100644
--- a/apps/login/app/(login)/password/page.tsx
+++ b/apps/login/app/(login)/password/page.tsx
@@ -55,6 +55,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName}
showDropdown
+ searchParams={searchParams}
>
)}
diff --git a/apps/login/app/(login)/signedin/page.tsx b/apps/login/app/(login)/signedin/page.tsx
index 4ee30a6c8d1..8f45b0d8189 100644
--- a/apps/login/app/(login)/signedin/page.tsx
+++ b/apps/login/app/(login)/signedin/page.tsx
@@ -43,6 +43,7 @@ export default async function Page({ searchParams }: { searchParams: any }) {
loginName={loginName ?? sessionFactors?.factors?.user?.loginName}
displayName={sessionFactors?.factors?.user?.displayName}
showDropdown
+ searchParams={searchParams}
>
diff --git a/apps/login/app/(login)/u2f/page.tsx b/apps/login/app/(login)/u2f/page.tsx
index a5136657a85..91a0e5b1617 100644
--- a/apps/login/app/(login)/u2f/page.tsx
+++ b/apps/login/app/(login)/u2f/page.tsx
@@ -62,6 +62,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName}
showDropdown
+ searchParams={searchParams}
>
)}
diff --git a/apps/login/app/(login)/u2f/set/page.tsx b/apps/login/app/(login)/u2f/set/page.tsx
index 8ee325dffbf..0e46249f77a 100644
--- a/apps/login/app/(login)/u2f/set/page.tsx
+++ b/apps/login/app/(login)/u2f/set/page.tsx
@@ -42,6 +42,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName}
showDropdown
+ searchParams={searchParams}
>
)}
{description}
diff --git a/apps/login/ui/UserAvatar.tsx b/apps/login/ui/UserAvatar.tsx
index 053656d83d0..97591cc0662 100644
--- a/apps/login/ui/UserAvatar.tsx
+++ b/apps/login/ui/UserAvatar.tsx
@@ -6,13 +6,33 @@ type Props = {
loginName?: string;
displayName?: string;
showDropdown: boolean;
+ searchParams?: Record;
};
export default function UserAvatar({
loginName,
displayName,
showDropdown,
+ searchParams,
}: Props) {
+ const params = new URLSearchParams({});
+
+ if (searchParams?.sessionId) {
+ params.set("sessionId", searchParams.sessionId);
+ }
+
+ if (searchParams?.organization) {
+ params.set("organization", searchParams.organization);
+ }
+
+ if (searchParams?.authRequestId) {
+ params.set("authRequestId", searchParams.authRequestId);
+ }
+
+ if (searchParams?.loginName) {
+ params.set("loginName", searchParams.loginName);
+ }
+
return (
@@ -26,7 +46,7 @@ export default function UserAvatar({
{showDropdown && (