Пример CloudKit JS Hello World: метод аутентификации не найден
Я работаю с примером каталога Apple CloudKit, и я просто пытаюсь заставить работать аутентификацию. Я хочу запустить этот JS-код в окне браузера (а не в Node JS). Я взял их код с их сайта вот так:
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
<script>
window.addEventListener('cloudkitloaded', function() {
CloudKit.configure({
containers: [{
containerIdentifier: 'iCloud.com.example.CloudKitCatalog',
apiToken: 'b86f0b5db29f04f45badba0366f39b7130a505f07765b5ba3a2ceb0cb3d96c0c',
persist: true,
environment: 'production',
signInButton: { id: 'sign-in-button', theme: 'black' },
signOutButton: { id: 'sign-out-button', theme: 'black' }
}]
})
var container = CloudKit.getDefaultContainer()
//-----
function gotoAuthenticatedState(userIdentity) {
var name = userIdentity.nameComponents
if(name) {
displayUserName(name.givenName + ' ' + name.familyName)
} else {
displayUserName('User record name: ' + userIdentity.userRecordName)
}
container
.whenUserSignsOut()
.then(gotoUnauthenticatedState)
}
//-----
function gotoUnauthenticatedState(error) {
if(error && error.ckErrorCode === 'AUTH_PERSIST_ERROR') {
showDialogForPersistError()
}
displayUserName('Unauthenticated User')
container
.whenUserSignsIn()
.then(gotoAuthenticatedState)
.catch(gotoUnauthenticatedState)
}
// Check a user is signed in and render the appropriate button.
return container.setUpAuth()
.then(function(userIdentity) {
// Either a sign-in or a sign-out button was added to the DOM.
// userIdentity is the signed-in user or null.
if(userIdentity) {
gotoAuthenticatedState(userIdentity)
} else {
gotoUnauthenticatedState()
}
})
})
</script>
<script src="https://cdn.apple-cloudkit.com/ck/2/cloudkit.js" async></script>
<div id="sign-in-button"></div>
<div id="sign-out-button"></div>
</body>
</html>
Но я продолжаю получать эти две ошибки:
cloudkit.js:14 GET https://api.apple-cloudkit.com/database/1/iCloud.com.example.CloudKitCatalog/production/public/users/caller?ckjsBuildVersion=2005ProjectDev34&ckjsVersion=2.6.1&clientId=735f8b19-3218-4493-80e4-7ab0b39041ac 401 (Unauthorized)
(anonymous) @ cloudkit.js:14
И сразу после этого...
cloudkit.js:14 Uncaught (in promise) t {
_ckErrorCode: "AUTHENTICATION_FAILED",
_uuid: "3b5cf33d-d56d-414f-83a4-6f320cd915b2",
_reason: "no auth method found",
_serverErrorCode: "AUTHENTICATION_FAILED",
_extensionErrorCode: undefined, …
}
Я чувствую, что это должна быть легкая часть, но я не могу получить даже первую setUpAuth()
функция работать. Я также пробовал свой собственный CloudKitcontainerIdentifier
а также apiToken
но я получаю ту же ошибку.
Кто-нибудь знает, что я делаю не так?
1 ответ
Кажется, что всего около 5 человек в мире понимают CloudKit JS API, и все они были переназначены для работы с ARKit, и они игнорируют переполнение стека.;)
Ради потомства я узнал, что у меня две ошибки.
== 1 ==
Вы должны игнорировать предупреждение об устаревании и использовать JS-файл версии 1 (ck/1/cloudkit.js
):
https://cdn.apple-cloudkit.com/ck/1/cloudkit.js
== 2 ==
Несмотря на то, что говорится в документации, на самом деле вы не можете указать кнопку аутентификации <div id="">
в конфигурации вашего контейнера. Кнопка входа начала отображаться для меня, когда я изменил свой HTML, чтобы использовать по умолчанию Apple<div>
ID:
<div id="apple-sign-in-button"></div>
<div id="apple-sign-out-button"></div>
Я надеюсь, что это поможет кому-то другому.:)
Кажется, есть проблема в cloudkit.js (когда не используется Node?), Когда он пытается сохранить файл cookie аутентификации. Вы можете обмануть это примерно так:
function MyAuth()
{
}
MyAuth.prototype.putToken = function (containerIdentifier, authToken)
{
console.log('save cookie: ' + containerIdentifier + ' = ' + authToken);
sessionStorage.setItem('auth.' + containerIdentifier, JSON.stringify(authToken));
}
MyAuth.prototype.getToken = function(containerIdentifier)
{
console.log('load cookie: ' + containerIdentifier);
return JSON.parse(sessionStorage.getItem('auth.' + containerIdentifier));
}
var gAuth = new MyAuth();
и настройте свой контейнер с помощью:
CloudKit.configure({
containers: [<container config>],
services: {authTokenStore: gAuth}
});
sessionStorage будет хранить файл cookie до закрытия браузера. Преобразование json используется потому, что при выходе из системы устанавливается значение null, которое сохраняется как "null", а затем загружается неправильно. Вы также можете сохранить его локально в хэше или в фактическом файле cookie.
Также ваша конфигурация неверна, потому что вы выровняли и удалили член apiTokenAuth:
CloudKit.configure({
containers: [{
containerIdentifier: 'iCloud.com.example.CloudKitCatalog',
environment: 'production',
apiTokenAuth: {
apiToken: 'b86f0b5db29f04f45badba0366f39b7130a505f07765b5ba3a2ceb0cb3d96c0c',
persist: true,
signInButton: { id: 'sign-in-button', theme: 'black' },
signOutButton: { id: 'sign-out-button', theme: 'black' }
}
}]
})
Это работает с v1 или v2 cloudkit.js.