Skip to content

Commit 7285f12

Browse files
refactor: remove signedInCredential and used persisted tokenresult to get provider
1 parent 815d8ca commit 7285f12

2 files changed

Lines changed: 33 additions & 22 deletions

File tree

FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

samples/swiftui/FirebaseSwiftUIExample/FirebaseSwiftUIExampleTests/FirebaseSwiftUIExampleTests.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ struct FirebaseSwiftUIExampleTests {
103103
#expect(service.authenticationState == .unauthenticated)
104104
#expect(service.authView == .authPicker)
105105
#expect(service.currentError == nil)
106-
#expect(service.signedInCredential == nil)
107106
#expect(service.currentUser == nil)
108107
try await service.createUser(email: createEmail(), password: kPassword)
109108

@@ -139,7 +138,6 @@ struct FirebaseSwiftUIExampleTests {
139138
#expect(service.currentUser == nil)
140139
#expect(service.authView == .authPicker)
141140
#expect(service.currentError == nil)
142-
#expect(service.signedInCredential == nil)
143141

144142
try await service.signIn(email: email, password: kPassword)
145143

@@ -152,10 +150,6 @@ struct FirebaseSwiftUIExampleTests {
152150
service.currentUser != nil
153151
}
154152
#expect(service.currentUser != nil)
155-
try await waitForStateChange {
156-
service.signedInCredential != nil
157-
}
158-
#expect(service.signedInCredential != nil)
159153
#expect(service.authView == .authPicker)
160154
#expect(service.currentError == nil)
161155
}

0 commit comments

Comments
 (0)