【问题标题】:Can't Get CloudKit to Authenticate (Using Javascript and a Server-to-Server Key)无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)
【发布时间】:2017-03-03 00:59:16
【问题描述】:

我正在尝试使用 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"

我什至尝试在 cloudkit.js 中添加 console.log 行来记录发送到 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 文件,但我仍然不知道为什么事情不起作用。任何帮助,即使只是调试想法,将不胜感激。

附:我确定我可以访问 CloudKit 容器,因为当我转到 https://icloud.developer.apple.com/dashboard/ 时,它在 URL https://icloud.developer.apple.com/dashboard/#*myContainerId* 中。

【问题讨论】:

    标签: javascript cloudkit


    【解决方案1】:

    显然cloudkit.js 有两个(或更多?)版本。因为 Apple 竭尽全力像地球上所有其他公司一样使用 NPM(即使他们在 CloudKit 说明中使用它),并且因为服务器到服务器 CloudKit 连接的文档是有点事后的想法,当你真的想要 Node 的时候,很容易用 web 版本结束。而且(除非你真的擅长阅读缩小的代码)没有办法仅仅通过查看来判断。

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

    故事的寓意:如果提供您的 API 库的公司太愚蠢/傲慢/无论如何都无法像其他人一样使用npm,那么您必须非常小心,不要误伤自己。确保您遵循上面链接的特定于节点的说明。

    【讨论】:

    • 这帮助我解决了类似的问题,因为我不知道 CloudKitJS 的第二个版本不是升级,至少在阅读 Apple 文档的链接后我是这么认为的。从<script src="https://cdn.apple-cloudkit.com/ck/2/cloudkit.js" async></script> 切换回<script src="https://cdn.apple-cloudkit.com/ck/1/cloudkit.js" async></script>,它解决了我的问题。
    • 我已经为此奋斗了 DAYS 天,几乎放弃了。下载您指出的示例并获得正确版本的 CloudKit JS 非常有帮助。我还发现了需要的一个微妙但非常重要的代码行:process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 我的服务器拒绝了所有没有它的请求。非常感谢!
    • 是的,它仅适用于第一版 ClouKit JS,但即使在公共数据库上也要求进行身份验证。我仍然收到以下错误,但它现在正在工作。有人知道如何解决吗?在控制台工具上展开错误消息后,它显示了一个带有 redirectURL 和 uuid 的对象。“XML Parsing Error: not well-formed Location: api.apple-cloudkit.com/database/1/iCloud.com.kueiapp...311e194dee13...a706 Line Number 1, Column 1:”
    猜你喜欢
    • 2016-05-16
    • 2016-12-11
    • 2019-11-06
    • 2020-11-24
    • 2016-05-17
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多