Skip to content

Commit 5ecf59c

Browse files
refactor: allow providers to use whatever sign-in methods they wish
1 parent 29840d4 commit 5ecf59c

12 files changed

Lines changed: 32 additions & 27 deletions

File tree

FirebaseSwiftUI/FirebaseAppleSwiftUI/Sources/Services/AppleProviderAuthUI.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ extension AuthenticateWithAppleDialog: ASAuthorizationControllerDelegate {
114114

115115
// MARK: - Apple Provider Swift
116116

117-
public class AppleProviderSwift: AuthProviderSwift {
117+
public class AppleProviderSwift: CredentialAuthProviderSwift {
118118
public let scopes: [ASAuthorization.Scope]
119119
let providerId = "apple.com"
120120

@@ -149,6 +149,6 @@ public class AppleProviderAuthUI: AuthProviderUI {
149149
public let id: String = "apple.com"
150150

151151
@MainActor public func authButton() -> AnyView {
152-
AnyView(SignInWithAppleButton(provider: provider))
152+
AnyView(SignInWithAppleButton(provider: provider as! CredentialAuthProviderSwift))
153153
}
154154
}

FirebaseSwiftUI/FirebaseAppleSwiftUI/Sources/Views/SignInWithAppleButton.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import SwiftUI
2020
@MainActor
2121
public struct SignInWithAppleButton {
2222
@Environment(AuthService.self) private var authService
23-
let provider: AuthProviderSwift
24-
public init(provider: AuthProviderSwift) {
23+
let provider: CredentialAuthProviderSwift
24+
public init(provider: CredentialAuthProviderSwift) {
2525
self.provider = provider
2626
}
2727
}

FirebaseSwiftUI/FirebaseAuthSwiftUI/Sources/Services/AuthService.swift

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ import FirebaseAuthUIComponents
1717
import FirebaseCore
1818
import SwiftUI
1919

20-
public protocol AuthProviderSwift {
20+
/// Base protocol for all authentication providers
21+
public protocol AuthProviderSwift {}
22+
23+
/// Protocol for providers that can directly create an AuthCredential
24+
/// Used by Google, Apple, Twitter, Facebook, and OAuth providers
25+
public protocol CredentialAuthProviderSwift: AuthProviderSwift {
2126
@MainActor func createAuthCredential() async throws -> AuthCredential
2227
}
2328

@@ -27,6 +32,9 @@ public protocol AuthProviderUI {
2732
var provider: AuthProviderSwift { get }
2833
}
2934

35+
/// Protocol for phone authentication which requires a two-step flow:
36+
/// 1. Verify phone number to get verification ID
37+
/// 2. Create credential with verification ID and code
3038
public protocol PhoneAuthProviderSwift: AuthProviderSwift {
3139
@MainActor func verifyPhoneNumber(phoneNumber: String) async throws -> String
3240
@MainActor func createAuthCredential(verificationId: String,
@@ -189,7 +197,7 @@ public final class AuthService {
189197
)
190198
}
191199

192-
public func signIn(_ provider: AuthProviderSwift) async throws -> SignInOutcome {
200+
public func signIn(_ provider: CredentialAuthProviderSwift) async throws -> SignInOutcome {
193201
do {
194202
let credential = try await provider.createAuthCredential()
195203
let result = try await signIn(credentials: credential)
@@ -829,8 +837,9 @@ public extension AuthService {
829837
let password = try await passwordPrompt.confirmPassword()
830838
let credential = EmailAuthProvider.credential(withEmail: email, password: password)
831839
_ = try await user.reauthenticate(with: credential)
832-
} else if let matchingProvider = providers.first(where: { $0.id == providerId }) {
833-
let credential = try await matchingProvider.provider.createAuthCredential()
840+
} else if let matchingProvider = providers.first(where: { $0.id == providerId }),
841+
let credentialProvider = matchingProvider.provider as? CredentialAuthProviderSwift {
842+
let credential = try await credentialProvider.createAuthCredential()
834843
_ = try await user.reauthenticate(with: credential)
835844
} else {
836845
throw AuthServiceError.providerNotFound("No provider found for \(providerId)")

FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Services/FacebookProviderAuthUI.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import FirebaseAuth
1919
import FirebaseAuthSwiftUI
2020
import SwiftUI
2121

22-
public class FacebookProviderSwift: AuthProviderSwift {
22+
public class FacebookProviderSwift: CredentialAuthProviderSwift {
2323
let scopes: [String]
2424
let providerId = "facebook.com"
2525
private let loginManager = LoginManager()

FirebaseSwiftUI/FirebaseFacebookSwiftUI/Sources/Views/SignInWithFacebookButton.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import SwiftUI
2222
@MainActor
2323
public struct SignInWithFacebookButton {
2424
@Environment(AuthService.self) private var authService
25-
let facebookProvider: FacebookProviderSwift
25+
let facebookProvider: CredentialAuthProviderSwift
2626

27-
public init(facebookProvider: FacebookProviderSwift) {
27+
public init(facebookProvider: CredentialAuthProviderSwift) {
2828
self.facebookProvider = facebookProvider
2929
}
3030
}

FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Services/GoogleProviderAuthUI.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import GoogleSignIn
1919
import GoogleSignInSwift
2020
import SwiftUI
2121

22-
public class GoogleProviderSwift: AuthProviderSwift {
22+
public class GoogleProviderSwift: CredentialAuthProviderSwift {
2323
let scopes: [String]
2424
let clientID: String
2525
let providerId = "google.com"
@@ -79,6 +79,6 @@ public class GoogleProviderAuthUI: AuthProviderUI {
7979
}
8080

8181
@MainActor public func authButton() -> AnyView {
82-
AnyView(SignInWithGoogleButton(googleProvider: provider))
82+
AnyView(SignInWithGoogleButton(googleProvider: provider as! CredentialAuthProviderSwift))
8383
}
8484
}

FirebaseSwiftUI/FirebaseGoogleSwiftUI/Sources/Views/SignInWithGoogleButton.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ import SwiftUI
2626
@MainActor
2727
public struct SignInWithGoogleButton {
2828
@Environment(AuthService.self) private var authService
29-
let googleProvider: AuthProviderSwift
29+
let googleProvider: CredentialAuthProviderSwift
3030

31-
public init(googleProvider: AuthProviderSwift) {
31+
public init(googleProvider: CredentialAuthProviderSwift) {
3232
self.googleProvider = googleProvider
3333
}
3434
}

FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Services/OAuthProviderSwift.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import FirebaseCore
1818
import SwiftUI
1919

2020
/// Configuration for a generic OAuth provider
21-
public class OAuthProviderSwift: AuthProviderSwift {
21+
public class OAuthProviderSwift: CredentialAuthProviderSwift {
2222
public let providerId: String
2323
public let scopes: [String]
2424
public let customParameters: [String: String]
@@ -130,6 +130,6 @@ public class OAuthProviderAuthUI: AuthProviderUI {
130130
}
131131

132132
@MainActor public func authButton() -> AnyView {
133-
AnyView(GenericOAuthButton(provider: provider))
133+
AnyView(GenericOAuthButton(provider: provider as! CredentialAuthProviderSwift))
134134
}
135135
}

FirebaseSwiftUI/FirebaseOAuthSwiftUI/Sources/Views/GenericOAuthButton.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import SwiftUI
2020
@MainActor
2121
public struct GenericOAuthButton {
2222
@Environment(AuthService.self) private var authService
23-
let provider: AuthProviderSwift
24-
public init(provider: AuthProviderSwift) {
23+
let provider: CredentialAuthProviderSwift
24+
public init(provider: CredentialAuthProviderSwift) {
2525
self.provider = provider
2626
}
2727
}

FirebaseSwiftUI/FirebasePhoneAuthSwiftUI/Sources/Services/PhoneAuthProviderAuthUI.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ public class PhoneProviderSwift: PhoneAuthProviderSwift {
3434
}
3535
}
3636

37-
@MainActor public func createAuthCredential() async throws -> AuthCredential {
38-
fatalError("Not implemented")
39-
}
40-
4137
@MainActor public func createAuthCredential(verificationId: String,
4238
verificationCode: String) async throws
4339
-> AuthCredential {

0 commit comments

Comments
 (0)