Новый Apple Sign In конфликтует с Google Login, создает 2 учетных записи пользователей - PullRequest
1 голос
/ 23 января 2020

У меня проблема с тем, что пользователи, ранее зарегистрировавшиеся с помощью входа Google или электронной почты в моем приложении, не могут войти в ту же учетную запись с помощью Apple Sign In (даже если электронная почта не скрыта).

Несмотря на то, что токены авторизации обрабатываются отдельно, Apple и Google / Firebase, одно и то же электронное письмо в нашей Коллекции пользователей не может быть объединено (сохраните существующую учетную запись пользователя и используйте новый токен для существующей учетной записи). Это приводит к 2 учетным записям: существующим и новым, что проблематично c с новым входом в Apple.

Кто-нибудь сталкивался с этой проблемой для своего приложения iOS и с предстоящим весенним требованием Apple Sign In, как они обрабатывают 2 токена и объединяют новые и старые учетные записи?

import UIKit
import Firebase
import FirebaseAuth
import Pages
import GoogleSignIn
import AuthenticationServices

class FireAuthUserInfo {
    var firstName:String?
    var lastName:String?
    var email:String?

    init(googleUser:GIDGoogleUser) {
        self.firstName = googleUser.profile.givenName
        self.lastName = googleUser.profile.familyName
    }
    @available(iOS 13.0, *)
    init(credential:ASAuthorizationCredential) {
        switch credential {
                  case let appleIDCredential as ASAuthorizationAppleIDCredential:

                  default:
                      break
                  }
    }

}
class UserManager: NSObject {
    static let shared = UserManager()

    func signInWithGoogle (user: GIDGoogleUser) {
        let authentication = user.authentication
        let credential = GoogleAuthProvider.credential(withIDToken: (authentication?.idToken)!,
                                                       accessToken: (authentication?.accessToken)!)
        let userInfo = FireAuthUserInfo(googleUser: user)
        self.authInFirebase(with: credential, user: userInfo)
    }
    @available(iOS 13.0, *)
    func signInWithApple (with credential:AuthCredential, appleUser:ASAuthorizationCredential) {
        let userInfo = FireAuthUserInfo(credential: appleUser)
        self.authInFirebase(with: credential, user: userInfo)
    }
    func authInFirebase(with credential:AuthCredential, user:FireAuthUserInfo? = nil) {
        Utility.showProgress("")
        Auth.auth().signIn(with: credential) { (authResult, error) in
            guard error == nil else { Utility.dismissProgress(); return}
            guard let authResult = authResult else { Utility.dismissProgress(); return}

            // User is signed in
            let refCollection = Constants.db.databaseProfile

            var query = refCollection.whereField("UserID", isEqualTo: authResult.user.uid)
            if let user = user, let email = user.email {
                query =  refCollection.whereField("email", isEqualTo: email)
            }
            query.getDocuments(completion: { (snapShot, error) in
                Utility.dismissProgress()
                guard error == nil else { return}
                if snapShot == nil || snapShot!.isEmpty == true {
                    let userObject = User()
                    userObject.uid = authResult.user.uid
                    userObject.email = authResult.user.email

                    if let user = user {
                        userObject.firstName = user.firstName
                        userObject.lastName = user.lastName
                        if let email = user.email {
                            userObject.email = email
                        }
                    }

                    self.saveProfile(user: userObject)
                    //self.gotoFillDetails(page: 3)
                    self.goToOnBoardingScreens()
                }else {
                    for rest in snapShot!.documents {
                        let restDict = rest.data()
                        guard !(restDict.isEmpty) else {
                            continue
                        }
                        let userData = User.getInstanceFrom(dictionary: restDict)!
                        if let user = user, let email = user.email {
                            userData.email = email
                        }
                        UserDefaultHelper.saveUser(user: userData)
                        AppData.sharedInstance.user = userData
                        AppData.getAllJournalEntries()
                        break
                    }
                    self.gotoMain()
                }

            })
        }
    }

    func saveProfile(user : User) {
        let autoKey = User.getNewKey()
        //        let autoKey = Constants.refs.databaseProfile.childByAutoId().key
        let newProfile = [
            "UserID": user.uid ?? "",
            "Email": user.email ?? "",
            "FirstName": user.firstName ?? "",
            "LastName": user.lastName ?? "",
            "Gender": "",
            "BirthDate": Date(),
            "JobTitle": "",
            "Location": "",
            "TellMeMore": "",
            "Referral": "",
            "Last_Login": Date(),
            "CreatedAt": Date(),
            "UpdatedAt": Date(),
            "ProfileImage": "",
            "Key": autoKey,
            "DeviceToken": AppData.sharedInstance.deviceToken ?? "",
            "FcmToken": AppData.sharedInstance.fcmToken ?? "",
            ] as [String : Any]

        let user = User.getInstanceFrom(dictionary: newProfile)
        user?.saveToFirebase()
        UserDefaultHelper.saveUser(user: user!)
        AppData.sharedInstance.user = user
    }

Я смог воспроизвести эти результаты в тестовом приложении Apple: https://developer.apple.com/documentation/authenticationservices/implementing_user_authentication_with_sign_in_with_apple. Когда пользователь входит в Apple и делится своим адресом электронной почты в то время, я могу получать электронную почту пользователя, но когда пользователь пытается войти снова, я не могу получить это письмо. Похоже на недосмотр Apple?

...