@@ -135,12 +135,10 @@ public final class AuthService {
135135 public let passwordPrompt : PasswordPromptCoordinator = . init( )
136136 public var currentMFARequired : MFARequired ?
137137 private var currentMFAResolver : MultiFactorResolver ?
138- private var pendingMFACredential : AuthCredential ?
139138
140139 // MARK: - Provider APIs
141140
142141 private var listenerManager : AuthListenerManager ?
143- public var signedInCredential : AuthCredential ?
144142
145143 var emailSignInEnabled = false
146144
@@ -251,7 +249,6 @@ public final class AuthService {
251249 }
252250 do {
253251 let result = try await currentUser? . link ( with: credentials)
254- signedInCredential = credentials
255252 updateAuthenticationState ( )
256253 return . signedIn( result)
257254 } catch let error as NSError {
@@ -275,7 +272,6 @@ public final class AuthService {
275272 return try await handleAutoUpgradeAnonymousUser ( credentials: credentials)
276273 } else {
277274 let result = try await auth. signIn ( with: credentials)
278- signedInCredential = result. credential ?? credentials
279275 updateAuthenticationState ( )
280276 return . signedIn( result)
281277 }
@@ -285,8 +281,6 @@ public final class AuthService {
285281 if error. code == AuthErrorCode . secondFactorRequired. rawValue {
286282 if let resolver = error
287283 . userInfo [ AuthErrorUserInfoMultiFactorResolverKey] as? MultiFactorResolver {
288- // Preserve the original credential for use after MFA resolution
289- pendingMFACredential = credentials
290284 return handleMFARequiredError ( resolver: resolver)
291285 }
292286 } else {
@@ -375,7 +369,6 @@ public extension AuthService {
375369 return try await handleAutoUpgradeAnonymousUser ( credentials: credential)
376370 } else {
377371 let result = try await auth. createUser ( withEmail: email, password: password)
378- signedInCredential = result. credential
379372 updateAuthenticationState ( )
380373 return . signedIn( result)
381374 }
@@ -752,12 +745,41 @@ public extension AuthService {
752745 }
753746 }
754747
755- func reauthenticateCurrentUser ( on user : User ) async throws {
756- guard let providerId = signedInCredential ? . provider else {
757- throw AuthServiceError
758- . reauthenticationRequired ( " Recent login required to perform this operation. " )
748+ /// Gets the provider ID that was used for the current sign-in session
749+ private func getCurrentSignInProvider ( ) async throws -> String {
750+ guard let user = currentUser else {
751+ throw AuthServiceError . noCurrentUser
759752 }
760753
754+ // Get the ID token result which contains the signInProvider claim
755+ let tokenResult = try await user. getIDTokenResult ( forcingRefresh: false )
756+
757+ // The signInProvider property tells us which provider was used for this session
758+ let signInProvider = tokenResult. signInProvider
759+
760+ // If signInProvider is not empty, use it
761+ if !signInProvider. isEmpty {
762+ return signInProvider
763+ }
764+
765+ // Fallback: if signInProvider is empty, try to infer from providerData
766+ // Prefer non-password providers as they're more specific
767+ let providerId = user. providerData. first ( where: { $0. providerID != " password " } ) ? . providerID
768+ ?? user. providerData. first? . providerID
769+
770+ guard let providerId = providerId else {
771+ throw AuthServiceError . reauthenticationRequired (
772+ " Unable to determine sign-in provider for reauthentication "
773+ )
774+ }
775+
776+ return providerId
777+ }
778+
779+ func reauthenticateCurrentUser( on user: User ) async throws {
780+ // Get the provider from the token instead of stored credential
781+ let providerId = try await getCurrentSignInProvider ( )
782+
761783 if providerId == EmailAuthProviderID {
762784 guard let email = user. email else {
763785 throw AuthServiceError . invalidCredentials ( " User does not have an email address " )
@@ -919,16 +941,11 @@ public extension AuthService {
919941
920942 do {
921943 let result = try await resolver. resolveSignIn ( with: assertion)
922-
923- // After MFA resolution, result.credential is nil, so restore the original credential
924- // that was used before MFA was triggered
925- signedInCredential = result. credential ?? pendingMFACredential
926944 updateAuthenticationState ( )
927945
928946 // Clear MFA resolution state
929947 currentMFARequired = nil
930948 currentMFAResolver = nil
931- pendingMFACredential = nil
932949
933950 } catch {
934951 throw AuthServiceError
0 commit comments