Firebase电子邮件链接身份验证:为什么我必须做两次

时间:2020-10-30 10:31:03

标签: ios swift firebase firebase-authentication

我正在使用Firebase电子邮件链接验证,我正在向用户发送链接,他们必须点击它,这完全是标准流程,但是用户必须做两次,因为他们的电子邮件从第一次尝试就不会得到验证。

从技术上讲,我从 loginProcessor.swift 中的signInUserAfterEmailLinkClick()收到错误“无密码的电子邮件验证错误”,但是为什么?

我的代码:

AppDelegate.swift

// For Passwordless Email Login to Handle Dynamic Link after User Clicks Email Link
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

    if let incomingURL = userActivity.webpageURL {

        // Parse incoming
        let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in

            guard error == nil else {
                print("Found an error: \(error!.localizedDescription)")
                return
            }
            if let dynamicLink = dynamicLink {
                loginProcessor.handleIncomingDynamicLink(dynamicLink)
            }
        }
        if linkHandled {
            return true
        }
        else {
            // Maybe do other things with dynamic links in future?
            return false
        }
    }
    return false
}

LoginProcessor.swift

// Handles the link and saves it to userDefaults to assist with login.
func handleIncomingDynamicLink(_ dynamicLink: DynamicLink) {
    guard let url = dynamicLink.url else {
        print("My dynamic link object has no url")
        return
    }
    print("Incoming link parameter is \(url.absoluteString)")

    let link = url.absoluteString
    if Auth.auth().isSignIn(withEmailLink: link) {
        
        print("successful with email link...")
        
        signInUserAfterEmailLinkClick()
        
        if let current = Auth.auth().currentUser {
            current.reload { (error) in
                if error == nil {
                    print("email verified \(current.isEmailVerified)")
                }
            }
            print("email verified \(current.isEmailVerified)")
        }

        // Save link to userDefaults to help finalize login.
        UserDefaults.standard.set(link, forKey: "Link")

        // Send notification to ViewController to push the First Time Login VC
        NotificationCenter.default.post(
            name: Notification.Name("SuccessfulPasswordlessEmailNotification"), object: nil, userInfo: nil)
    }
}
}

// Sign in user after they clicked email link called from AppDelegate
@objc func signInUserAfterEmailLinkClick() {

    print("sign in user after email link")
    
    // Get link url string from the dynamic link captured in AppDelegate.
    if let link = UserDefaults.standard.value(forKey: "Link") as? String {
        self.link = link
    }
    
    print("user email for sign in: \(userEmail) link for sign in: \(link)")

    // Sign user in with the link and email.
    Auth.auth().signIn(withEmail: userEmail!, link: link!) { (result, error) in

        if error == nil && result != nil {

            if (Auth.auth().currentUser?.isEmailVerified)! {
                print("User verified with passwordless email")
                firebaseUpdateUserTableWithNonAnonymousUser(username: loginPlayer.firstName, useremail: loginPlayer.email)
                // TODO: Do something after user verified like present a new View Controller

            }
            else {
                print("User NOT verified by passwordless email")

            }
        }
        else {
            print("Error with passwordless email verfification: \(error?.localizedDescription ?? "Strangely, no error avaialble.")")
        }
    }
}

0 个答案:

没有答案