无法获取CloudKit进行身份验证(使用Javascript和服务器到服务器密钥)

时间:2017-03-03 00:59:17

标签: javascript cloudkit

我正在尝试使用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*中。

1 个答案:

答案 0 :(得分:2)

显然有两个(或更多?)版本的cloudkit.js。因为Apple不遗余力地而不是像地球上的其他公司一样使用NPM(即使他们在CloudKit指令中使用它),并且因为服务器到服务器CloudKit连接的文档是一种事后的想法,当你真的想要一个Node时,很容易找到web版本。而且(除非你真的擅长阅读缩小的代码),只能通过观察来判断它。

事实证明我已经以某种方式获得了cloudkit.js的以网络为中心的版本,我需要以节点为中心的版本。在我重复列出here的过程后,我得到了该版本,最终能够使我的CloudKit代码正常工作。

故事的道德:如果提供你的API库的公司过于愚蠢/傲慢/任何其他人使用npm,你必须非常小心,不要用脚射击自己。请确保您遵循上面链接的特定于节点的说明。