diff --git a/api/server/controllers/AuthController.js b/api/server/controllers/AuthController.js index dfef2bbfa1..cb4e1a7eea 100644 --- a/api/server/controllers/AuthController.js +++ b/api/server/controllers/AuthController.js @@ -10,7 +10,13 @@ const { setAuthTokens, registerUser, } = require('~/server/services/AuthService'); -const { findUser, getUserById, deleteAllUserSessions, findSession } = require('~/models'); +const { + deleteAllUserSessions, + getUserById, + findSession, + updateUser, + findUser, +} = require('~/models'); const { getGraphApiToken } = require('~/server/services/GraphTokenService'); const { getOAuthReconnectionManager } = require('~/config'); const { getOpenIdConfig } = require('~/strategies'); @@ -72,16 +78,38 @@ const refreshController = async (req, res) => { const openIdConfig = getOpenIdConfig(); const tokenset = await openIdClient.refreshTokenGrant(openIdConfig, refreshToken); const claims = tokenset.claims(); - const { user, error } = await findOpenIDUser({ + const { user, error, migration } = await findOpenIDUser({ findUser, email: claims.email, openidId: claims.sub, idOnTheSource: claims.oid, strategyName: 'refreshController', }); + + logger.debug( + `[refreshController] findOpenIDUser result: user=${user?.email ?? 'null'}, error=${error ?? 'null'}, migration=${migration}, userOpenidId=${user?.openidId ?? 'null'}, claimsSub=${claims.sub}`, + ); + if (error || !user) { + logger.warn( + `[refreshController] Redirecting to /login: error=${error ?? 'null'}, user=${user ? 'exists' : 'null'}`, + ); return res.status(401).redirect('/login'); } + + // Handle migration: update user with openidId if found by email without openidId + // Also handle case where user has mismatched openidId (e.g., after database switch) + if (migration || user.openidId !== claims.sub) { + const reason = migration ? 'migration' : 'openidId mismatch'; + await updateUser(user._id.toString(), { + provider: 'openid', + openidId: claims.sub, + }); + logger.info( + `[refreshController] Updated user ${user.email} openidId (${reason}): ${user.openidId ?? 'null'} -> ${claims.sub}`, + ); + } + const token = setOpenIDAuthTokens(tokenset, res, user._id.toString(), refreshToken); user.federatedTokens = {