Как сохранить / получить токен доступа в / из определенной группы доступа цепочки для ключей - PullRequest
0 голосов
/ 30 апреля 2019

Как я могу сохранить веб-токен JSON в определенной группе доступа цепочки для ключей и как я могу извлечь этот токен из цепочки для ключей с помощью Objective-c? (Я хочу сделать это без использования брелка для ключей.)

Ответы [ 3 ]

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

Вы действительно можете хранить / извлекать / удалять значения в связке ключей, используя C API, предоставляемый Apple. Но сначала я хочу уточнить ответы, которые вы уже получили: хранить JWT в пользовательских настройках по умолчанию полностью не рекомендуется, поскольку все, что там хранится, рассматривается как простой текст и ставит под угрозу безопасность ваших данных / API.

Вы можете убедиться в этом сами, зайдя в комплект приложения через FileManager и найдя список предпочтений.plist, если я хорошо помню.

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

Итак, эти шаги суммируют общее использование цепочки для ключей:

  • Поскольку цепочка для ключей является БД SQLite3, вам нужно начать с создания запроса.
  • НЕТ проверки на наличие дубликатов, когда вы что-то храните там, поэтому вам нужно будет удалить текущий элемент перед добавлением нового, просто чтобы сохранить вещи на месте, если элемент, который вы пытаетесь удалить, не существует, он ничего не делает .
  • Добавить элемент (запрос) в цепочку ключей.

Вот пример в Swift, поймите его, чтобы вы могли легко перевести его в ObjC:

// value is anything you want to store, let's say "Hello Jobs", and you need to
convert that value to data.

if let valueData = value.data(using: .utf8) {
        return [kSecClass as String: kSecClassGenericPassword as String,
                kSecAttrAccount as String: key,
                kSecValueData as String: valueData] as [String:Any]
    }

SecItemDelete(query as CFDictionary) // Delete the query if exists
SecItemAdd(query as CFDictionary, nil) // Store your value

Как видите, вам нужно привести запросы к CFDictionary, так как это ожидаемый тип, который C API получает в качестве параметра.

Теперь, чтобы извлечь сохраненное значение, вам нужно сделать следующее:

// You need a query again, but this time you add extra parameters to indicate you want to return the value as data using the boolean below and to limit the query to just 1 item.
let query = [kSecClass as String: kSecClassGenericPassword as String,
                 kSecAttrAccount as String: key,
                 kSecReturnData as String: kCFBooleanTrue,
                 kSecMatchLimit as String: kSecMatchLimitOne] as [String: Any]

// You define a var to use its reference (memory address) as its required by the SecItemCopyMatching API so it can store the outcome of the query there.
    var dataTypeRef: AnyObject?
    let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
    if status == noErr {
        return dataTypeRef as? Data // If the query was successful you retrieve the data by casting your previously defined var to a Data type
    }

Единственное, что здесь осталось сделать, - это преобразовать извлеченное значение Data во все, что вам нужно, в этом случае это будет String как тип вашего JWT.

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

??

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

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>keychain-access-groups</key>
    <array>
        <string>656CMN2Q97.com.mycompany.myapp</string>
    </array>
</dict>
</plist>

Затем чтение и запись в него так же просто, как это:

NSString *kapiToken = @"apiToken";
NSString *kServices = @"Services";

self.apiToken = [UICKeyChainStore stringForKey:kapiToken service:kServices];

....

[UICKeyChainStore setString:self.apiToken forKey:kapiToken service:kServices];
0 голосов
/ 30 апреля 2019

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

Вы можете хранить токен в классе Singleton , так как я думаю, что этот токен будет обновляться при каждом перезапуске приложения.Если это не так, вы также можете сохранить его в NSUserDefaults.

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