Я хотел бы получить доступ к паролю приложения цепочки для ключей (kSecClassGenericPassword
) другого приложения (другого поставщика, не может делиться в группе) из моего изолированного приложения macOS.
Способ, которым яПредполагается, что это даст пользователю кнопку «Повторно использовать пароль от VendorApp».Затем запустите SecItemCopyMatching()
для службы / учетной записи.Затем я ожидал бы, что сама система цепочки для ключей выведет диалоговое окно, предлагающее пользователю разрешить или запретить операцию.
Теперь это почти работает, SecItemCopyMatching
возвращает результат с некоторыми метаданными.Но он не возвращает фактические данные и не запрашивает пользователя.
Итак, вопрос: как я могу заставить Keychain Services запросить у пользователя разрешение на передачу данных моему приложению?kSecUseAuthenticationUI
вроде предполагает, что это должно быть возможно.
Вот то, что я пытаюсь:
let query : [ String : Any ] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecAttrService as String: service,
kSecReturnAttributes as String: true,
kSecMatchLimit as String: kSecMatchLimitOne,
kSecUseAuthenticationUI as String: kSecUseAuthenticationUIAllow,
kSecUseOperationPrompt as String: "Login Using VendorApp"
]
var item : CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item)
// status gives errSecSuccess and we do get some proper item fields
// always empty, obviously, it would need to prompt the user for permission
let data = item?[kSecValueData as String] as? Data