From feb2084f58f38f4aecc76319ac0aa7cfa86eabb0 Mon Sep 17 00:00:00 2001 From: Oscar Cornish <35607967+OscarCornish@users.noreply.github.com> Date: Mon, 19 Jan 2026 20:24:32 +0000 Subject: [PATCH] refactor: return linked account in findOAuthUser (#7331) Co-authored-by: Maxwell <145994855+ping-maxwell@users.noreply.github.com> --- .../better-auth/src/db/internal-adapter.ts | 35 +++++++++++-------- .../better-auth/src/oauth2/link-account.ts | 18 +++++----- packages/core/src/types/context.ts | 6 +++- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/packages/better-auth/src/db/internal-adapter.ts b/packages/better-auth/src/db/internal-adapter.ts index c5173466d2..55f9a0fc19 100644 --- a/packages/better-auth/src/db/internal-adapter.ts +++ b/packages/better-auth/src/db/internal-adapter.ts @@ -721,26 +721,29 @@ export const createInternalAdapter = ( providerId: string, ) => { // we need to find account first to avoid missing user if the email changed with the provider for the same account - const account = await (await getCurrentAdapter(adapter)) - .findMany({ - model: "account", - where: [ - { - value: accountId, - field: "accountId", - }, - ], - join: { - user: true, + const account = await (await getCurrentAdapter(adapter)).findOne< + Account & { user: User | null } + >({ + model: "account", + where: [ + { + value: accountId, + field: "accountId", }, - }) - .then((accounts) => { - return accounts.find((a) => a.providerId === providerId); - }); + { + value: providerId, + field: "providerId", + }, + ], + join: { + user: true, + }, + }); if (account) { if (account.user) { return { user: account.user, + linkedAccount: account, accounts: [account], }; } else { @@ -756,6 +759,7 @@ export const createInternalAdapter = ( if (user) { return { user, + linkedAccount: account, accounts: [account], }; } @@ -785,6 +789,7 @@ export const createInternalAdapter = ( }); return { user, + linkedAccount: null, accounts: accounts || [], }; } else { diff --git a/packages/better-auth/src/oauth2/link-account.ts b/packages/better-auth/src/oauth2/link-account.ts index b02a16529c..d7e855a152 100644 --- a/packages/better-auth/src/oauth2/link-account.ts +++ b/packages/better-auth/src/oauth2/link-account.ts @@ -37,12 +37,14 @@ export async function handleOAuthUserInfo( const isRegister = !user; if (dbUser) { - const hasBeenLinked = dbUser.accounts.find( - (a) => - a.providerId === account.providerId && - a.accountId === account.accountId, - ); - if (!hasBeenLinked) { + const linkedAccount = + dbUser.linkedAccount ?? + dbUser.accounts.find( + (acc) => + acc.providerId === account.providerId && + acc.accountId === account.accountId, + ); + if (!linkedAccount) { const trustedProviders = c.context.options.account?.accountLinking?.trustedProviders; const isTrustedProvider = @@ -111,14 +113,14 @@ export async function handleOAuthUserInfo( if (c.context.options.account?.storeAccountCookie) { await setAccountCookie(c, { - ...hasBeenLinked, + ...linkedAccount, ...freshTokens, }); } if (Object.keys(freshTokens).length > 0) { await c.context.internalAdapter.updateAccount( - hasBeenLinked.id, + linkedAccount.id, freshTokens, ); } diff --git a/packages/core/src/types/context.ts b/packages/core/src/types/context.ts index 762246ef2e..75e2fbdd52 100644 --- a/packages/core/src/types/context.ts +++ b/packages/core/src/types/context.ts @@ -91,7 +91,11 @@ export interface InternalAdapter< email: string, accountId: string, providerId: string, - ): Promise<{ user: User; accounts: Account[] } | null>; + ): Promise<{ + user: User; + linkedAccount: Account | null; + accounts: Account[]; + } | null>; findUserByEmail( email: string,