@@ -6,6 +6,7 @@ import { loginFailed } from "@/components/idps/pages/login-failed";
66import { loginSuccess } from "@/components/idps/pages/login-success" ;
77import { registrationFailed } from "@/components/idps/pages/registration-failed" ;
88import { Translated } from "@/components/translated" ;
9+ import { getMostRecentSessionCookie } from "@/lib/cookies" ;
910import { generateRouteMetadata } from "@/lib/metadata" ;
1011import { getServiceUrlFromHeaders } from "@/lib/service-url" ;
1112import {
@@ -15,6 +16,7 @@ import {
1516 getIDPByID ,
1617 getLoginSettings ,
1718 getOrgsByDomain ,
19+ getSession ,
1820 listUsers ,
1921 retrieveIDPIntent ,
2022 updateHuman ,
@@ -266,6 +268,29 @@ export default async function Page(props: {
266268 if ( ! resolvedUserId ) {
267269 return linkingFailed ( "User context missing" ) ;
268270 }
271+
272+ try {
273+ const recentCookie = await getMostRecentSessionCookie ( ) ;
274+ const { session } = await getSession ( {
275+ serviceUrl,
276+ sessionId : recentCookie . id ,
277+ sessionToken : recentCookie . token ,
278+ } ) ;
279+
280+ if ( session ?. factors ?. user ?. id !== resolvedUserId ) {
281+ console . error (
282+ "Security Violation: Attempt to link IDP to different user" ,
283+ {
284+ sessionUserId : session ?. factors ?. user ?. id ,
285+ targetUserId : resolvedUserId ,
286+ } ,
287+ ) ;
288+ return linkingFailed ( "Access Denied" ) ;
289+ }
290+ } catch {
291+ return linkingFailed ( "Error getting user session" ) ;
292+ }
293+
269294 if ( ! options ?. isLinkingAllowed ) {
270295 // linking was probably disallowed since the invitation was created
271296 return linkingFailed ( "Linking is no longer allowed" ) ;
0 commit comments