Я пытаюсь осуществить вход через 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 и учетная запись на основе электронной почты. Они работают нормально.
У меня есть некоторые функции и триггеры облачного кода, но ни одна из них не влияет на вход в систему или пользователя.
То, что я пробовал
- Очистить сборку
- Очистить папку
- Удалить приложение
- Использован новый сервер Parse
- Протестирован iOS код с back4app - это сработало
- Элемент списка
раздел аутентификации в индексе. 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 после завершения входа в систему. эти скриншоты. Может ли это быть связано с этим?
Я сначала попробовал несколько иной подход к созданию анонимного пользователя, а затем попытался связать его, как предложено в parse-community / parse- сервер # 5632 (комментарий), но все равно получаю ошибку 206 !!
Меня попросили поднять эту проблему на SO, поскольку я не могу быть связан с Parse iOS SDK. Проблема возникла в Parse SDK