Получите доступ к значениям цепочки для ключей, сохраненным ExpoSecureStore, из приложения Flutter [iOS] - PullRequest
1 голос
/ 16 марта 2020

У меня есть приложение ReactNative (опубликовано только для iOS), которое использует ExpoSecureStore для помещения и чтения значений из iOS Связки ключей.

Я перехожу к Flutter и I нужно для того, чтобы пользователи вошли в систему, т.е. чтобы получить их токены авторизации из ранее установленной версии приложения RN.

Итак, вот что я делаю:

  1. Я устанавливаю приложение RN из магазина приложений,
  2. Войдите в систему (токен сохраняется в ExpoSecureStore),
  3. Установите мое приложение Flutter
  4. Попытайтесь получить доступ к связке ключей - ничего не найдено!
  5. Переустановите приложение RN из магазина приложений,
  6. Когда я открываю приложение, вошел пользователь!

Итак, установка Flutter не выполняется. Не удаляйте токены, но они не могут получить к ним доступ.

Обновление 18.3.2020.

Вот как выглядит последняя сборка *1030* ReactNative в AppstoreConnect: React Native entitlements on AppstoreConnect

Вот та же информация для нашей Флаттер сборка: Flutter entitlements on AppstoreConnect

Я попытался установить группу цепочек для ключей в проекте XCode Flutter для всех видов значений: TEAM_ID.*, TEAM_ID., TEAM_ID, *, TEAM_ID.com.my_real_app_id et c .. но ничего помогло Entitlements of Flutter app XCode project

Что-то мне не хватает?

============== оригинальный вопрос продолжается ==== ============

Я использую FlutterSecureStoragePlugin ( ссылку на .m файл ) для доступа к значениям цепочки для ключей.

Вот ссылка на файл EXSecureStore.m - EXSecureStore.m на GitHub .

  • Приложение Flutter имеет тот же идентификатор пакета, поэтому не должно быть проблемой.

  • Я изменил его исходный код, чтобы использовать тот же сервис цепочки для ключей (kSecAttrService), который по умолчанию равен "app".

  • Кроме того, я скопировал и адаптировал код для чтения значений цепочки для ключей от ExpoSecureStore.m до FlutterSecureStoragePlugin.m, но все равно не повезло ..

Может быть есть ли разница в том, как библиотеки RN и Flutter передают строки в нативный iOS? Я предполагаю, что должно быть что-то происходящее с доступом к Цепочке для ключей, которого я не знаю, поэтому любая помощь очень приветствуется!

Спасибо за чтение!

1 Ответ

0 голосов
/ 25 марта 2020

Я наконец-то решил проблему доступа к безопасному хранилищу expo!

TL; DR

Самое важное, что вы настроили тот же keychain access group, тот же kSecAttrService (связка ключей) услуга) и, конечно же, ключ элемента, к которому вы хотите получить доступ.

Вот какие предварительные условия:

  • , вы должны установить для keychain access group значение то же значение, что и в сборке реагирующего натива: TEAM_ID.*. Это может быть достигнуто одним из двух вариантов:

    • , установив для Совместное использование цепочки для ключей значение *, как показано на скриншоте ниже: или
    • Откройте файл (project_dir/ios/Runner/Runner.entitlements) и добавьте элемент $(AppIdentifierPrefix)* или TEAM_ID.* в keychain access groups массив. Обратите внимание: если вы добавляете первый элемент, перед * нет ., так как AppIdentifierPrefix преобразуется в TEAM_ID. перед сборкой. Ссылка на документы Apple на keychain-access-groups права . xCode keychain access group setup for react native / expo and flutter
  • Если разрабатываемое приложение имеет с тем же идентификатором пакета (т.е. это обновление существующего ReactNatvie / Expo), у вас не должно возникнуть проблем с доступом к элементам цепочки для ключей (конечно, при выполнении всех других предварительных условий). Кроме того, если приложение имеет ту же группу совместного использования цепочки для ключей , в данном случае TEAM_ID.*, оно также должно иметь возможность доступа к элементам цепочки для ключей. Обратите внимание, что если для группы доступа цепочки для ключей установлено значение TEAM_ID. *, Это означает, что только приложения, разработанные одним и тем же разработчиком (командой), могут получить доступ к элементам цепочки для ключей приложения RN.

  • необходимо изменить библиотеку Flutter ( или собственный исходный код iOS), чтобы он использовал ту же службу цепочки для ключей (kSecAttrService), что и Expo . Для Экспо, если вы не передадите параметр keychainService в параметрах SecureStore, атрибут kSecAttrService элемента, который вы хотите написать (или получить), будет app. Вы можете сами это увидеть здесь в исходном коде нативной библиотеки expo на GitHub (ссылка) . Я сделал ответвление от библиотеки флаттера, и в будущем я сделаю запрос на извлечение, но вы также можете просто изменить службу цепочки для ключей по умолчанию на app. В настоящее время по умолчанию используется flutter_secure_storage_service, как видно из исходного кода плагина на GitHub (ссылка) .

  • самая хитрая часть - из-за которой я сомневался во всех из вышеперечисленных шагов - это установка правильного ключа (kSecAttrAccount) для элемента цепочки для ключей , который я хотел получить. Что мне помогло, так это использование метода плагина Flutter readAll (ссылка на собственный исходный код readAll на GitHub ). Это показало мне, что элементы цепочки для ключей действительно были там, но ключи отличались от тех, которые использовало приложение ReactNative. Как я выяснил при отладке (это нигде в документации !!!), имя пользователя expo и имя проекта expo добавляются ** перед строкой, используемой для ключа **! Таким образом, если в приложении ReactNative вы сохраните токен с ключом accessToken, он будет сохранен в связке ключей как @expousername/project-name-accessToken! Его нет в документации, и я не знаю, как это происходит, потому что я просмотрел исходный код

В своем вопросе я сказал, что скопировал Objective - C код из библиотеки expo в плагин Flutter, но в этом не было необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...