无法让 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 Web Services 的身份验证流程与 Zapier 结合使用