Проблема с авторизацией контроллера при работе с несколькими запросами

#ios #swift #keychain #apple-sign-in

Вопрос:

Итак, вот в чем проблема:

Если у меня есть записи пароля электронной почты и идентификатора Apple id в связке ключей для приложения и я хочу запросить эти данные для автоматического входа в систему, я могу получить информацию об учетных записях на основе пароля электронной почты.

Хотя Apple ID работает не так, как ожидалось. Я получаю ASAuthorizationAppleIDCredential объект с. authorizationCode == nil Я действительно получаю credential.identityToken и могу расшифровать токен. Это действительно так, но дело в том, что мне это нужно authorizationCode .

Если я использую автономную login функцию AppleAuthenticator , она работает правильно. ASAuthorizationController работает performRequests идеально, и я могу получить authorizationCode от ASAuthorizationAppleIDCredential . Проблема в AggregatedAuthenticator том, что . Похоже, что ASAuthorizationController он вроде как сломан и не может получить все данные, если к нему передано более одного запроса.

 AggregatedAuthenticator(anchor: view.window!).startAutoLogin() // does not work with apple id
 

но

 AppleAuthenticator(anchor: view.window!).login() // works
 

Единственная разница в том, что AppleAuthenticator используется только один запрос ASAuthorizationController .

Единственный обходной путь, который я мог бы придумать, — это если я зайду туда AggregatedAuthenticator и снова войду в систему, см. Комментарий в коде:

 public func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    switch authorization.credential {
    case let appleIDCredential as ASAuthorizationAppleIDCredential:
        // Question: here we receive the credential without authorizationCode, but why?
        appleAuthenticator.login(with: appleIDCredential)
        // BUT if I do:
        // appleAuthenticator.login()
        // it works fine, but it shows that bottom sheet again asking for your face/touch-id again, but only for apple id this time
    case let emailPasswordPair as ASPasswordCredential:
        emailAuthenticator.login(with: emailPasswordPair)
    default:
        print("Irrelevant stuff")
    }
}
 

Есть идеи, ребята?

Взгляните на пример кода ниже:

https://github.com/SergeyPetrachkov/ASAuthControllerIssueSample

Ответ №1:

Хорошо, ребята, это регрессия iOS 15. Раньше все работало.