Как сохранить / восстановить пароль от iOS Autofill Password? - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь реализовать пароль автозаполнения Apple. Я наконец заработал, но я хочу, чтобы мое приложение запоминало имя пользователя / пароль при запуске приложения, если учетные данные действительно были созданы. В настоящее время я храню имя пользователя и пароль с помощью модуля «KeychainSwift», но я понял, что автозаполнение в любом случае создает новую цепочку для ключей (они теперь появляются в моих сохраненных паролях iPhone), поэтому я мог бы также использовать эти учетные данные напрямую. Я попытался получить это с этим, но говорит "не найдено подходящих элементов":

SecRequestSharedWebCredential(nil, nil){ credentials, error in
        guard let credentials = credentials else { print("Keychain: No credentials found"); return }
        guard error == nil else { print("Keychain Error:", error?.localizedDescription ?? "no error description"); return }

        let credential: CFDictionary = unsafeBitCast(CFArrayGetValueAtIndex(credentials, i), to: CFDictionary.self)
        let server = unsafeBitCast(CFDictionaryGetValue(credential, unsafeBitCast(kSecAttrServer, to: UnsafeRawPointer<Void>.self)), to: CFString.self)
        let account = unsafeBitCast(CFDictionaryGetValue(credential, unsafeBitCast(kSecAttrAccount, to: UnsafeRawPointer<Void>.self)), to: CFString.self)
        let password = unsafeBitCast(CFDictionaryGetValue(credential, unsafeBitCast(kSecSharedPassword, to: UnsafeRawPointer<Void>.self)), to: CFString.self)

        print("Keychain OK:", server, account, password)
    }

Запрос прекращается во втором операторе защиты, потому что «ошибка» не ноль. Я что-то пропустил? Это вообще возможно?

Редактировать # 1 : Я читал обо всем этом, и у меня возникает ощущение, что мне нужно отдельно сохранять / загружать комбинацию имя пользователя / пароль (через Keychain или UserDefaults) всякий раз, когда пользователь регистрируется или входит в систему. Кто-нибудь может подтвердить, что это ожидаемое поведение? Мне это просто кажется странным, поскольку Autofill уже где-то хранит эти учетные данные (я предположил, что это связка ключей), поскольку FaceID выскакивает и автоматически заполняет текстовые поля с правильным именем пользователя / паролем, которое я указал при регистрации.

Редактировать # 2 : Это то, чего я хотел бы достичь в идеале : опция автозаполнения в быстром типе клавиатуры, и когда пользователь регистрируется / добавляет его, чтобы добавить его к сохраненным паролям, которые отображаются в меню «Настройки»> «Пароли и учетная запись»> «Веб-сайт». & Пароли приложений ". Может быть, я не понимаю фактический процесс автозаполнения или разницу между цепочкой ключей iCloud и общими учетными данными веб-сайта, но я не могу понять, как добиться того, что мне нужно.

Вместо этого происходит очень много неожиданных вещей (ошибок?) : при нажатии автозаполнения автоматически создаются новые учетные данные, но я не могу получить их с помощью кода, который я разместил выше, но если я добавлю его вручную с помощью SecAddSharedWebCredential() Затем я могу получить их. Зачем? Они буквально оба отображаются в моих сохраненных паролях в одном домене с одинаковым значком приложения. Кроме того, когда Signin ViewController закрывается (при выполнении Segue), мне предлагается сохранить пароль, но в тот момент, когда я пытаюсь зарегистрироваться с именем пользователя + настоятельно рекомендованный пароль, затем нажимаю кнопку «Назад» (которая отклоняет ViewController), он все равно добавляет его в Сохраненные пароли, на этот раз даже без запроса Сохранить пароль!

Я так смущен всем этим, лол. Пожалуйста, мне нужна помощь:)

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вы не должны хранить имя пользователя и пароль.Когда пользователь регистрируется в первый раз, вы должны сгенерировать токен.Токен должен храниться в вашем приложении Keychain.Когда пользователь запускает ваше приложение во второй раз, вы должны использовать токен для входа в систему.

Хранение токена намного безопаснее, чем сохранение имени пользователя и пароля.

Если вы хотите сохранить пароль, то, по крайней мере, храните только хэш пароля, а не простой текст.

0 голосов
/ 27 апреля 2019

Быстрый ответ: Вы можете сохранять / извлекать пароли, используя автозаполнение , только если вы добавили их вручную с помощью SecAddSharedWebCredential().

Вот что я узнал обо всем процессе:

Просто включив автозаполнение (установив contentType на .username и .password / .newPassword, а также добавив связанный домен), приложение автоматически предложит «Сохранить пароль?»когда активный ViewController закрывается, если я вхожу в систему или регистрируюсь со своим собственным паролем (круто, мне не нужно добавлять код для добавления этих учетных данных в цепочку ключей iCloud).Однако, если я регистрируюсь с помощью «Надежного пароля» от Apple, когда мой активный ViewController закрывается (т. Е. При нажатии кнопки «Назад», использовании interactivePopGestureRecognizer или даже при успешном завершении регистрации), автоматически добавляетучетные данные для связки ключей iCloud, даже не показывая «Сохранить пароль?»подсказка (без ведома пользователя или согласия).Я чувствую, что этого не должно происходить , поэтому я только что отправил сообщение об ошибке.

Теперь, когда учетные данные добавляются автоматически , мы не можем получить пароль с ожидаемымфункция SecRequestSharedWebCredential(nil,nil): учетные данные не найдены. Мы можем получить пароль, только если мы добавили его вручную с помощью SecAddSharedWebCredential() (что я также нахожу немного странным, поскольку конечные результаты точно такие же).Но это не то, что я хотел, так как подсказка SecAddSharedWebCredential() отличается и слишком многословна, а SecRequestSharedWebCredential() также показывает подсказку, хотя я хотел получить ее без вывода сообщений (скажем, путем сохранения имени пользователя в UserDefaults и извлечения его с помощьюSecRequestSharedWebCredential(nil, username).

Вывод: я не мог делать то, что хотел (используйте iCloud Keychain, чтобы сохранять и молча извлекать нужные учетные данные, не нуждаясь в копии в моем собственном приложении Keychain).отдельно хранится имя пользователя / хэш в моей цепочке ключей для автоматического входа в систему, и я оставил автозаполнение включенным для быстрого входа в систему на случай, если пользователю потребуется временно выйти из системы (что удаляет имя пользователя / хэш из цепочки ключей моего приложения), сохранив пароль в iCloudбрелок.

...