我正在使用Apple的新CloudKit JS参考和示例代码来构建一个简单的CRUD应用程序。在我甚至可以进入CRUD之前,我被Apple身份验证所阻止。
index.html
<html>
<body>
<div id="apple-sign-in-button">Sign in
<span id="username"></span>
</div>
<script>
/*
* Initialize the global objects we will need.
*/
if(typeof CKCatalog === 'undefined') {
CKCatalog = {};
}
if(typeof CKCatalog.tabs === 'undefined') {
CKCatalog.tabs = {
'readme': [{}],
'not-found': [{}]
};
}
</script>
<script src="js/init.js"></script>
<script src="js/cloudkit-code-samples/authentication.js"></script>
<script>
window.addEventListener('cloudkitloaded',CKCatalog.init);
</script>
<script async src="https://cdn.apple-cloudkit.com/ck/1/cloudkit.js"> </script>
</body>
包括div id =&#34; apple-sign-in-button&#34;和span id =&#34;用户名&#34;摆脱了所有错误,除了:
无法加载资源:服务器响应状态为421(错误请求)。
在其他任何地方提及此错误通常都与SMTP或FTP绑定。知道发生了什么事吗?
答案 0 :(得分:6)
CloudKit.js库是CloudKit Web服务的包装器,its documentation表示当调用需要身份验证但用户未登录的请求时会发生HTTP 421。
这是预期的,因为您的应用可能需要确定用户是否已登录,如果没有,则显示相应的登录按钮。 CloudKit Catalog example's section on Authentication显示了如何通过调用container.setUpAuth()
来设置它,这将检查用户并在未检测到任何人的情况下呈现登录按钮。您的init.js代码中可能会发生这种情况,但如果没有看到它,我无法确定。
我看到您的网页上有apple-sign-in-button
div。如果您正在调用setUpAuth
方法,那么您应该会在其中看到“登录”按钮。
用户点击该按钮并登录后,您可以重新发出收到421的原始请求,并且应该获得有效的200.
请不要忘记,如果您想要保留用户的CloudKit会话,则可以在初始化Container时使用auth: { persist: true }
(有关详情,请参阅CloudKit.js文档)。
您还希望确保您已在CloudKit仪表板中为您的Container创建了一个API令牌。这是初始化Container时使用的令牌。查看关于CloudKit JS和Web服务的WWDC 2015视频,以查看此演示。
我希望有所帮助!
更新:
在测试您的网络应用程序时,请确保您已配置了您的API令牌(使用CloudKit信息中心)以允许您正在测试的域(例如localhost)。这最初是Sam的问题,但localhost现在是开发环境中API令牌的受支持域。
答案 1 :(得分:2)
将Dave Browning的评论复制到他的答案中作为一个全面的答案,因为这对我来说似乎是个问题:
localhost就是问题所在。 localhost目前不支持 使用CloudKit Web服务的有效域,但它也是一个已知的错误。如果 您使用工具将本地服务器映射到假域(例如foo.com) 那么它现在应该解决你的问题