我正在尝试使用Apple的cloudkit.js
文件与CloudKit建立服务器到服务器的连接。然而,尽管在几个小时内搞乱了配置,我似乎无法让CloudKit认为我的请求有效。
我的配置逻辑非常简单:
const privateKeyFile = `${__dirname}/eckey.pem`;
const keyID = '*some key ID*';
const config = {
containers: [
{
containerIdentifier: 'iCloud.com.*someNameSpace.someProject*',
environment: 'development',
serverToServerKeyAuth: { keyID, privateKeyFile },
},
],
services: {
fetch,
},
};
CloudKit.configure(config);
const container = CloudKit.getDefaultContainer();
container.setUpAuth();
但是,最终container.setUpAuth();
始终会产生{"uuid":"*some UUID*","serverErrorCode":"AUTHENTICATION_FAILED","reason":"no auth method found"
。
我甚至尝试在console.log
内部添加cloudkit.js
行来记录发送到CloudKit的内容,它看起来确实有正确的标题:
_host: 'https://api.apple-cloudkit.com',
_path: '',
_params: { ckjsBuildVersion: '17AProjectDev77', ckjsVersion: '1.2.0' },
_headers:
{ 'content-type': 'text/plain',
'X-Apple-CloudKit-Request-ISO8601Date': '2017-03-03T00:52:48Z',
'X-Apple-CloudKit-Request-KeyID': '*my key*',
'X-Apple-CloudKit-Request-SignatureV1': '*what looks like a valid signature*' },
_body: undefined,
_method: 'GET',
_wsApiVersion: 1,
_containerIdentifier: '*my container identifier*',
_containerEnvironment: 'development',
_databaseName: 'public',
_apiModuleName: 'database',
_responseClass: [Function: a],
_apiEntityName: 'users',
_apiAction: 'current' }
我已经浪费了几个小时试图弄清楚(缩小的)cloudkit.js
文件,我仍然不知道为什么事情不起作用。任何帮助,甚至只是调试想法,都将非常感激。
P.S。我确信我可以访问CloudKit容器,因为当我转到https://icloud.developer.apple.com/dashboard/
时,它位于网址https://icloud.developer.apple.com/dashboard/#*myContainerId*
中。
答案 0 :(得分:2)
显然有两个(或更多?)版本的cloudkit.js
。因为Apple不遗余力地而不是像地球上的其他公司一样使用NPM(即使他们在CloudKit指令中使用它),并且因为服务器到服务器CloudKit连接的文档是一种事后的想法,当你真的想要一个Node时,很容易找到web版本。而且(除非你真的擅长阅读缩小的代码),只能通过观察来判断它。
事实证明我已经以某种方式获得了cloudkit.js
的以网络为中心的版本,我需要以节点为中心的版本。在我重复列出here的过程后,我得到了该版本,最终能够使我的CloudKit代码正常工作。
故事的道德:如果提供你的API库的公司过于愚蠢/傲慢/任何其他人使用npm
,你必须非常小心,不要用脚射击自己。请确保您遵循上面链接的特定于节点的说明。