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

Posted

技术标签:

【中文标题】无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)【英文标题】:Can't Get CloudKit to Authenticate (Using Javascript and a Server-to-Server Key) 【发布时间】: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* 中。

【问题讨论】:

【参考方案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:”

以上是关于无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit 服务器到服务器身份验证

CloudKit 用户身份验证与单点登录

CloudKit 服务器到服务器身份验证 + 安全角色

将 CloudKit Web Services 的身份验证流程与 Zapier 结合使用

CloudKit 错误:在 Mac 上未经过身份验证,但我已登录

cloudKit:CKSubscription 错误“此请求需要经过身份验证的帐户””