iCloud Cloudkit CKFetchWebAuthTokenOperation - PullRequest
0 голосов
/ 07 ноября 2018

Мое приложение iOS проверяет состояние учетной записи iCloud, а затем запрашивает iCloud WebToken, используя следующий метод:

@objc static func fetchWebAuthToken ( _ apiToken : String, _ callback : @escaping CCallbackFunctionWithBoolAndString )
{
    let fetchAuthorization = CKFetchWebAuthTokenOperation(apiToken: apiToken)

    fetchAuthorization.fetchWebAuthTokenCompletionBlock = { webToken, error in
        guard let webToken = webToken, error == nil else {
            callback ( false, "[SWIFT] fetchWebAuthToken() error. " + (error?.localizedDescription ?? ""));
            return;
        }

        let encodedWebToken = token.addingPercentEncoding (
                withAllowedCharacters: CharacterSet(charactersIn: "+/=").inverted
            ) ?? token

        callback ( true, encodedWebToken );
        return;
    }

    CKContainer.default().privateCloudDatabase.add(fetchAuthorization);
}

Все работает правильно и возвращается правильно отформатированный веб-токен.

Затем я беру этот веб-токен и, используя Почтальон, формирую запрос (с удалением точных значений):

https://api.apple-cloudkit.com/database/1/iCloud.com.[my container]/development/private/users/caller?ckAPIToken=[development container token]&ckWebAuthToken=[web token]

Ответ:

{
  "uuid": "[abc]",
  "serverErrorCode": "ACCESS_DENIED",
  "reason": "private db access disabled for this account"
}

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

https://api.apple-cloudkit.com/database/1/iCloud.com.[my container]/development/public/users/caller?ckAPIToken=[development container token]&ckWebAuthToken=[web token]

{
  "userRecordName": "_[user id]",
  "nameComponents": {
    "givenName": "[First Name]",
    "familyName": "[Surname]"
  }
}

Итак, здесь есть два вопроса.

1) Если я запрашиваю веб-токен в коде для частной базы данных, почему он позволяет мне взаимодействовать только с общедоступной базой данных? Такое ощущение, что он предоставляет веб-токен, действительный только для общедоступной базы данных, независимо от базы данных, к которой я добавляю действие.

2) Каковы последствия для безопасности при проверке пользователя по общедоступной базе данных, подобной этой? Срок действия токена истекает через 30 минут, что помогает с этого фронта.

Чтобы доказать, что веб-токен работает с частной базой данных, я обновил «Sign In Callback» на панели инструментов, скопировал получившийся ckWebAuthToken и смог получить доступ к частной базе данных через PostMan, так что с этой стороны проблем нет , Кажется, что проблема заключается исключительно в веб-токене, возвращенном из кода iOS.

1 Ответ

0 голосов
/ 14 ноября 2018

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

При проверке не должно быть никаких угроз безопасности для общедоступной базы данных. На мой взгляд, Apple никогда не должна была называть это «публичной», потому что она не очень публичная. Обычно оно доступно пользователям приложения, но только приложение и прошедшие проверку пользователи могут осуществлять операции с базой данных, как определено разработчиком. Это не доступно для публики.

Я собираюсь предположить, что вы делаете что-то необычное с этим потоком аутентификации, поскольку аутентификация пользователя на устройстве iOS не требует прохождения ckWebAuthToken. :)

...