资源加载失败:服务器响应状态为421(错误请求)

4
我正在使用苹果的新CloudKit JS参考和示例代码来构建一个简单的CRUD应用程序。然而,在我能够进行CRUD之前,我被苹果身份验证阻止了。
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="apple-sign-in-button"和span id="username",除了以下错误:

无法加载资源:服务器响应状态为421(错误请求)。

任何其他地方提到此错误通常与SMTP或FTP有关。 有什么想法?


我得到了完全相同的错误。我甚至尝试了提供 SSL 证书,但没有成功。 - Simon
2个回答

6
CloudKit.js库是CloudKit Web Services的包装器,它的文档指出HTTP 421发生在调用需要身份验证但用户未登录的请求时。这是可以预料的,因为您的应用程序可能需要确定用户是否已登录,如果没有,则显示适当的“登录”按钮。CloudKit目录示例中关于身份验证的部分展示了如何通过调用container.setUpAuth()来设置此功能,该方法将检查用户并在未检测到用户时呈现“登录”按钮。您的init.js代码可能正在执行此操作,但我无法确定而不看到它。
我看到您的页面上有apple-sign-in-button div。如果您正在调用setUpAuth方法,则应在其中呈现“登录”按钮。
一旦用户点击该按钮并登录,您可以重新发出最初的请求,该请求收到了421错误,并应该得到有效的200响应。
请注意,如果要保持用户的CloudKit会话,可以在初始化容器时使用auth:{persist:true}。有关更多信息,请参阅CloudKit.js文档。
您还需要确保已在CloudKit仪表板中为您的容器创建了API令牌。这是您在初始化容器时使用的令牌。请查看有关CloudKit JS和Web服务的WWDC 2015视频以查看此演示。
希望这可以帮助您!
更新:
在测试Web应用程序时,请确保已配置API令牌(使用CloudKit仪表板)以允许您正在测试的域名(例如localhost)。这原本是Sam的问题,但现在在开发环境中支持localhost作为API令牌的受支持域。

嗨David,谢谢你的回复。我之前忽略了的错误代码文档很有帮助,你的观点也很有用。顺便说一下,我在init.js中设置了一个令牌+我的容器名称,并将persist设置为true。我看到调用了authentication.js中的setupAuth函数,但是按钮从未生成,而在调用setupAuth后发生的事情是调用goToUnauthenticatedState函数。我是否需要在我的index.html中构建另一个<div>以便渲染按钮?从文档中看不出来,但也许我需要做一些与DOM相关的事情。我对JS不是很熟悉。 - SamYoungNY
1
嗨,山姆。事实证明,如果您在苹果登录按钮div中有任何内容,它将无法呈现该按钮(因为它担心可能已经呈现了一个按钮)。这是一个错误,我会确保我们修复它,但同时,如果您完全清空div(甚至没有空格或换行符),那么您应该能看到按钮出现。 - Dave Browning
所以...现在按钮可以渲染了,当点击它时会弹出Apple iCloud登录窗口,但我仍然收到相同的错误,并且当我尝试在弹出窗口中登录时,控制台会出现两个相同的错误。我在这里添加了这些错误的console.log:http://hastebin.com/udopeputah.avrasm -- 感谢您的帮助! - SamYoungNY
只是为了明确,您成功登录,弹出窗口关闭,但您的应用程序仍然认为您未经身份验证? - Dave Browning
2
啊哈!本地主机是问题所在。CloudKit Web Services目前不支持localhost作为有效域,但这也是一个已知的错误。如果您使用工具将本地服务器映射到虚假域(例如foo.com),那么现在应该可以解决您的问题。 - Dave Browning
显示剩余3条评论

2

我将Dave Browning在他的答案中的评论转化为完整的答案,因为这似乎是我的问题:

本地主机名是问题所在。CloudKit Web服务当前不支持localhost作为有效域名,但这也是一个已知的错误。如果您使用工具将本地服务器映射到虚假域名(例如foo.com),那么现在应该可以解决您的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接