Ошибка 206 - невозможно изменить пользователя после входа в систему с помощью loginWithAuthType для Apple - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь осуществить вход через Apple. Я могу успешно аутентифицировать пользователя на моем iPhone 11, работающем iOS 13.3, используя iOS ASAuthorization API и получая ток, идентификатор пользователя, данные электронной почты. Parse Server версия 3.10.0. Parse iOS SDK 1.17.3

Как часть процесса входа в систему, я сохраняю дополнительную информацию в _User для вновь созданного пользователя после PFUser.logInWithAuthType (inBackground: "apple", успешно выполнено.

При сохранении появляется ошибка 206. Я где-то читал, что это может быть связано с nil sessionToken. Это действительно ноль после успешного входа в систему. PFUser.current (). Authenticated - true.

У меня также есть Facebook и учетная запись на основе электронной почты. Они работают нормально.

У меня есть некоторые функции и триггеры облачного кода, но ни одна из них не влияет на вход в систему или пользователя.

То, что я пробовал

  1. Очистить сборку
  2. Очистить папку
  3. Удалить приложение
  4. Использован новый сервер Parse
  5. Протестирован iOS код с back4app - это сработало
  6. Элемент списка

раздел аутентификации в индексе. js is

auth: {
apple: {   
  client_id: process.env.IOS_BUNDLE_ID
}

}

func loginWith(authType: String, using idTokenString: String, userId: String, callback: @escaping  (PFUser?, NSError?) -> ()) {

    PFUser.register(AuthDelegate(), forAuthType: "apple")

    PFUser.logInWithAuthType(inBackground: "apple", authData: ["token":idTokenString, "id": userId]).continueWith { task -> Any? in

        if ((task.error) != nil){

            DispatchQueue.main.async {

                CommonHelper.showMessage(messageBody: "Could not login.\n Please try again.", messageType: Constants.errorMessage, presentationStyle: .top, durationInSeconds: 3)

                logger.error("Error with parse login after SIWA: \(task.error!.localizedDescription)")
                callback(nil, task.error! as NSError)
            }

            return task

        }

        let loggedInUser = task.result

                DispatchQueue.main.async {

                CommonHelper.showMessage(messageBody: "Log in successful", messageType: Constants.successMessage, presentationStyle: .top, durationInSeconds: 3)

                callback(loggedInUser, nil)
            }

        return nil
    }
}


 @available (iOS 13,*)
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    switch authorization.credential {
        case let credentials as ASAuthorizationAppleIDCredential:

            guard let appleIDToken = credentials.identityToken else {

                 CommonHelper.showMessage(messageBody: "Encountered error during login", messageType: Constants.errorMessage, presentationStyle: .top, durationInSeconds: 5)

                //show login screen
                self.showLoginScreen()

                return
            }
            let idTokenString = String(data: appleIDToken, encoding: .utf8)

            self.loginWith(authType: "apple", using: idTokenString!, userId: appleCredentialUserId) { (loggedInUser, error) in

                if error == nil && loggedInUser != nil {

                    logger.info("Login successful with loggedInUser id \(loggedInUser!.objectId!)")

                    // go ahead with saving details in parse
                    let nameToBeSaved: String?

                    if credentials.fullName != nil {

                        nameToBeSaved = (credentials.fullName?.givenName ?? "") + " " + (credentials.fullName?.familyName  ?? "")
                    } else {
                        // saved when user sign in for first time
                        nameToBeSaved = userNameFromUserDefaults
                    }

                    self.saveUserDetailsOnParse(isNewUser: loggedInUser!.isNew, user: loggedInUser! ,socialId: appleCredentialUserId, email: emailToBeSaved, name: nameToBeSaved! , profileImageURL: nil, loginProvider: "apple",  callback: { (message, error) in


                        if error == nil {

                            //show app content
                            self.gotoHomeView()

                        } else if error != nil {

                            CommonHelper.showMessage(messageBody: "Enountered error. Please try again.", messageType: Constants.errorMessage, presentationStyle: .top, durationInSeconds: 0)

                            logger.error("Error updating User in Parse Error Code \(error.code):\(error.localizedDescription)")

                            CommonHelper.logoutFromParse()

                            //show login view
                            self.showLoginScreen()

                        }

                    }) //end of self.saveUserDetailsOnParse

                } else if error != nil {

                    CommonHelper.showMessage(messageBody: "Enountered error. Please try again.", messageType: Constants.errorMessage, presentationStyle: .top, durationInSeconds: 0)

                    logger.error("Couldnt login to Parse after SIWA \(error!.localizedDescription)")

                    self.showLoginScreen()

                }//end of  if error == nil && loggedInUser != nil

            } //self.loginWith(authType: "apple",


        break
    }
}


   func saveUserDetailsOnParse(isNewUser: Bool, user: PFUser?, socialId: String, email: String, name: String, profileImageURL: String?, loginProvider: String, callback: @escaping (String, NSError?) -> ())  {

        if name != "" {
           //if email based user logged in then name will be blank so update/add only if not blank ie for social login
            PFUser.current()?["name"] = name
        }
        if profileImageURL != nil {

            //if email based or Apple user logged in then URL will be blank so update/add only if not blank ie for social login
            PFUser.current()?["profile_image_url"] = profileImageURL!
        }

        PFUser.current()?["email"] = email

        if isNewUser {
           //if logged in user isNew  property is true
            self.saveNewUserToParse(socialId: socialId, loginProvider: loginProvider) { (errorMessage, error) in

                callback(errorMessage, error)
            }

        } else {
            //save details for existing user
            PFUser.current()?.saveInBackground(block: { (successSaveUser, error) in


                if successSaveUser {
                    logger.debug("User attributes updated to Parse")
                    callback("User attributes updated to Parse", nil)

                } else {

                    logger.debug("Error saving current PFUser post login to parse")
                    callback("Error saving current PFUser post login to parse", error! as NSError)

                }
            })
        }

    }


    func saveNewUserToParse(socialId: String?, loginProvider: String?, callback: @escaping (String, NSError?) -> ())  {

        PFUser.current()?["social_id"] = socialId
        PFUser.current()?["login_provider"] = loginProvider

        // Setup some seed values for the newly created user

        PFUser.current()?.saveInBackground(block: { (successSaveUser, error) in

                //MARK: Getting error 206 here
           if successSaveUser {
                logger.debug("User attributes  updated to Parse")

                let userPrefs = PFObject(className:"preferences")

                userPrefs["user"] = PFUser.current()
                //set seed prefs

                userPrefs.saveInBackground(block: { (success: Bool, error: Error?) in
                    if success {

                        logger.debug("User preferences created on Parse")


                    } else { //error saving preferences to Parse

                        logger.severe("error saving Preferences post login/signup to parse \(String(describing: error?.localizedDescription))")
                        callback("Error saving Preferences post login/signup to parse", error! as NSError)

                    }
                }) //end of userPrefs.saveInBackground

                callback("New user's attributes saved to Parse", nil)


            } else {

                    logger.debug("Error saving current PFUser post login/signup to parse  \(error!.localizedDescription)")
                    callback("Error saving current PFUser post login/signup to parse", error! as NSError)


            }
        })

    }

пакет. json

{
  "name": "parse-server-example",
  "version": "1.4.0",
  "description": "An example Parse API server using the parse-server module",
  "main": "index.js",
  "repository": {
    "type": "git",
    "url": "https://github.com/ashish-naik/parse-server.git"
  },
  "license": "MIT",
  "dependencies": {
    "express": ">4.11.x",
    "kerberos": ">0.0.x",
    "parse": ">1.8.0",
    "parse-server": "3.10.0",
    "underscore":"*"
  },
  "scripts": {
    "start": "node index.js"
  },
  "engines": {
    "node": ">=4.3"
  }
}

Я попытался отладить и заметил, что sessionToken равен nil после завершения входа в систему. эти скриншоты. Может ли это быть связано с этим? enter image description here enter image description here

Я сначала попробовал несколько иной подход к созданию анонимного пользователя, а затем попытался связать его, как предложено в parse-community / parse- сервер # 5632 (комментарий), но все равно получаю ошибку 206 !!

Меня попросили поднять эту проблему на SO, поскольку я не могу быть связан с Parse iOS SDK. Проблема возникла в Parse SDK

...