Мое приложение 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.