簡體   English   中英

從 Flutter 應用程序 [iOS] 訪問由 ExpoSecureStore 存儲的鑰匙串值

[英]Access Keychain values stored by ExpoSecureStore from a Flutter app [iOS]

我有一個 ReactNative 應用程序(僅針對 iOS 發布),它使用ExpoSecureStore來放置和讀取來自 iOS 鑰匙串的值。

我正在過渡到 Flutter,我需要讓用戶保持登錄狀態,即從之前安裝的 RN 版本的應用程序中獲取他們的身份驗證令牌。

所以,這就是我要做的:

  1. 我從 App Store 安裝了 RN 應用程序,
  2. 登錄(令牌與 ExpoSecureStore 一起保存),
  3. 安裝我的 Flutter 應用
  4. 嘗試訪問鑰匙串 - 什么也沒找到!
  5. 從 App Store 重新安裝 RN 應用程序,
  6. 當我打開應用程序時,用戶已登錄!

因此,我的 Flutter 安裝不會刪除令牌,但無法訪問它們。

2020 年 3 月 18 日更新。

這是ReactNative在 AppstoreConnect 上最新版本: 在 AppstoreConnect 上響應本機權利

以下是Flutter構建的相同信息: AppstoreConnect 上的 Flutter 權利

我嘗試將 Flutter 的 XCode 項目中的鑰匙串組設置為各種值: TEAM_ID.*TEAM_ID. , TEAM_ID , * , TEAM_ID.com.my_real_app_id等..但沒有任何幫助Flutter 應用程序 XCode 項目的權利

有什么我想念的嗎?

==============原始問題繼續==============

我正在使用FlutterSecureStoragePlugin鏈接到.m文件)來訪問 Keychain 值。

這是GitHub 上EXSecureStore.m文件的鏈接 - EXSecureStore.m

  • Flutter 應用程序具有相同的包 ID,所以這應該不是問題。

  • 我更改了它的源代碼,以便我使用相同的鑰匙串服務 ( kSecAttrService ),默認為"app"

  • 此外,我已經將用於讀取鑰匙ExpoSecureStore.m的代碼從ExpoSecureStore.m復制並改編為FlutterSecureStoragePlugin.m但仍然沒有運氣..

RN 和 Flutter 庫將字符串傳遞給原生 iOS 的方式有什么不同嗎? 我想一定有一些我不知道的鑰匙串訪問發生了什么,所以非常歡迎任何幫助!

感謝您的閱讀!

我終於解決了expo安全商店訪問問題!

TL; 博士

最重要的是,您設置了相同的keychain access group 、相同的kSecAttrService (鑰匙串服務),當然還有您要訪問的項目的密鑰。

以下是先決條件:

  • 您必須將keychain access group設置為與 react native 構建中相同的值,即TEAM_ID.* 這可以通過以下兩個選項之一來實現:

    • 鑰匙串共享功能設置為* ,如下面的屏幕截圖所示,
    • 打開權利文件 ( project_dir/ios/Runner/Runner.entitlements ) 並將項目$(AppIdentifierPrefix)*項目TEAM_ID.*keychain access groups數組。 請注意,如果您要添加第一項,則沒有. *之前,因為AppIdentifierPrefix被轉換成TEAM_ID. 在構建之前。 鏈接到關於keychain-access-groups entitlement 的蘋果文檔 xCode 鑰匙串訪問組設置用於 react native/expo 和 flutter
  • 如果您正在開發的應用程序具有相同的包 ID (即它是對現有 ReactNatvie/Expo 應用程序的更新),則訪問鑰匙串項目應該不會有任何問題(當然,當您執行所有其他前提條件時)。 此外,如果應用程序具有相同的鑰匙串共享組,在本例中為TEAM_ID.* ,它也應該能夠訪問鑰匙串項目。 請注意,將鑰匙串訪問組設置為 TEAM_ID.* 意味着只有由同一開發人員(團隊)開發的應用程序才能訪問 RN 應用程序的鑰匙串項目。

  • 您必須更改 Flutter 的庫(或本機 iOS)源代碼,以便它使用與 Expo 相同的鑰匙串服務( kSecAttrService 對於 Expo,如果您沒有在 SecureStore 選項中傳遞keychainService參數,則您要寫入(或獲取)的項目的kSecAttrService屬性將為app 你可以看到自己在這里,在GitHub上(鏈接)博覽會本地庫的源代碼 我創建了 flutter 庫的 fork,將來某個時候我會發出一個 pull request,但是你也可以將插件的默認鑰匙串服務更改為app 它目前默認為flutter_secure_storage_service ,如GitHub (link) 上插件的源代碼所示

  • 最棘手的部分 - 因為我在上述所有步驟中都懷疑 - 是我想要獲得的鑰匙串項目設置正確的密鑰( kSecAttrAccount 幫助我的是使用 Flutter 插件的readAll方法( 鏈接到 GitHub 上readAll的本機源代碼)。 它向我展示了鑰匙串項目實際上在那里,但鑰匙與 ReactNative 應用程序使用的鑰匙不同。 正如我通過調試發現的(文檔中沒有!!!),用於密鑰的字符串**之前添加了博覽會用戶名和博覽會項目名稱**! 因此,如果在 ReactNative 應用程序中您使用密鑰accessToken保存令牌,它將作為@expousername/project-name-accessToken保存到鑰匙串中! 它在文檔中無處可尋,我不知道它是如何發生的,因為我已經查看了源代碼

在我的問題中,我說我已經將 expo 庫中的 Objective-C 代碼復制到 Flutter 的插件中,但這不是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM