繁体   English   中英

SwiftUI - Firebase Apple Auth 未进行身份验证

[英]SwiftUI - Firebase Apple Auth not authenticating

我是 swiftUI 的新手...请原谅我的无知:) 我已经根据 Firebase 网站上的说明将大部分代码输入到我的项目中。 出于某种原因,苹果认证将无法成功认证。 不知道为什么,我怀疑位于“ConentView”中的代码的随机数部分可能没有链接到该服务。 如果有人对为什么会发生这种情况有任何想法,我将不胜感激任何帮助?

Xcode 模拟器 - 不会加载超过此屏幕

内容视图:

import SwiftUI
import FirebaseAuthUI
import CryptoKit
import AuthenticationServices

struct ContentView: View {
    
    private func sha256(_ input: String) -> String {
      let inputData = Data(input.utf8)
      let hashedData = SHA256.hash(data: inputData)
      let hashString = hashedData.compactMap {
        String(format: "%02x", $0)
      }.joined()

      return hashString
        
        
    }
    
    @ObservedObject private var authStateManager =     
    FirebaseAuthStateManager()
    @State var isShowSheet = false
    
    @State var currentNonce:String?
    private func randomNonceString(length: Int = 32) -> 
    String {
      precondition(length > 0)
      let charset: [Character] =
          ***key***
      var result = ""
      var remainingLength = length

      while remainingLength > 0 {
        let randoms: [UInt8] = (0 ..< 16).map { _ in
          var random: UInt8 = 0
          let errorCode = 
 SecRandomCopyBytes(kSecRandomDefault, 1, &random)
     if errorCode != errSecSuccess {
         fatalError(
"Unable to generate nonce. SecRandomCopyBytes   
failed with OSStatus \(errorCode)"
            )
          }
          return random
        }

        randoms.forEach { random in
          if remainingLength == 0 {
            return
          }

          if random < charset.count {
            result.append(charset[Int(random)])
            remainingLength -= 1
          }
        }
      }

      return result
    }
    
    
    
    

func authorizationController(controller: 
ASAuthorizationController, didCompleteWithAuthorization 
authorization: ASAuthorization) {
   if let appleIDCredential = authorization.credential 
        as? ASAuthorizationAppleIDCredential {
          guard let nonce = currentNonce else {
            fatalError("Invalid state: A login callback was 
       received, but no login request was sent.")
          }
          guard let appleIDToken = 
         appleIDCredential.identityToken else {
            print("Unable to fetch identity token")
            return
          }
guard let idTokenString = String(data: appleIDToken,     
encoding: 
.utf8) else {
print("Unable to serialize token string from data: \
(appleIDToken.debugDescription)")
            return
          }
          // Initialize a Firebase credential.
          let credential = 
 OAuthProvider.credential(withProviderID:"apple.com",                   
 idToken: idTokenString,rawNonce: nonce)
          // Sign in with Firebase.
 Auth.auth().signIn(with: credential) { (authResult, 
         error) in
            if (error != nil) {
              // Error. If error.code == 
.MissingOrInvalidNonce, make sure
              // you're sending the SHA256-hashed nonce as a 
 hex string with
              // your request to Apple.
                print(error?.localizedDescription as Any)
              return
            }
            // User is signed in to Firebase with Apple.
            // ...
          }
        }

      func authorizationController(controller: 
      ASAuthorizationController, didCompleteWithError error: 
      Error) {
        // Handle error.
        print("Sign in with Apple errored: \(error)")
      }
        
    }
    
    
    var body: some View {
        VStack {
            if authStateManager.signInState == false {
                // Sign-Out
                Button(action: {
                    self.isShowSheet.toggle()
                }) {
                Text("Sign-In")
                }
            } else {
                // Sign-In
                Button(action: {
                    do {
                        try Auth.auth().signOut()
                    } catch {
                        print("Error")
                    }
                }) {
                Text("Sign-Out")
                }
            }
        }
        .sheet(isPresented: $isShowSheet) {
            FirebaseUIView(isShowSheet: self.$isShowSheet)
        }
        
    }
}

FirebaseUI 视图:

import SwiftUI
import FirebaseAuthUI
import FirebaseGoogleAuthUI
import FirebaseOAuthUI
import CryptoKit
import AuthenticationServices
import FirebaseEmailAuthUI



struct FirebaseUIView: UIViewControllerRepresentable {
    @Binding var isShowSheet: Bool

    class Coordinator: NSObject,
        FUIAuthDelegate {
        
        // FirebaseUIView
        let parent: FirebaseUIView

        //
        init(_ parent: FirebaseUIView) {
            self.parent = parent
        }
        
        // MARK: - FUIAuthDelegate
        func authUI(_ authUI: FUIAuth, didSignInWith user: 
 User?, error: Error?) {
          // handle user and error as necessary
            if let error = error {
                //
                print("Auth NG:\
 (error.localizedDescription)")
            }
            if let _ = user {
                //
            }
            
            // Sheet(ModalView)
            parent.isShowSheet = false
        }
        
    }
    
    func makeCoordinator() -> Coordinator {
        // Coordinator
        Coordinator(self)
    }

    func makeUIViewController(context: Context) ->    
    UINavigationController {
        let authUI = FUIAuth.defaultAuthUI()!
        // You need to adopt a FUIAuthDelegate protocol to 
      receive callback
        authUI.delegate = context.coordinator
        
        let providers: [FUIAuthProvider] = [
            FUIGoogleAuth(authUI: authUI),
            FUIOAuth.microsoftAuthProvider(),
//            FUIFacebookAuth(authUI: authUI),
//            FUIOAuth.twitterAuthProvider(),
            FUIEmailAuth(),
//            FUIPhoneAuth(authUI:authUI),
            FUIOAuth.appleAuthProvider(),
        ]
        authUI.providers = providers
        
        // FirebaseUI
        let authViewController = authUI.authViewController()
        
        
        
        return authViewController
    }
    
    
    func updateUIViewController(_ uiViewController: 
     UINavigationController, context: Context) {
        
    }
    
}

[内容视图[][2] 2

从 FirebaseService 查看 SignInWithApple: https://github.com/rebeloper/FirebaseService

事实证明我的代码没有任何问题。 当我从模拟器切换到实际的 iPhone 设备时,代码运行完美。 这是Xcode模拟器的已知BUG。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM