从 iCloud 获取 CalDAV 事件返回“403 Forbidden”

Posted

技术标签:

【中文标题】从 iCloud 获取 CalDAV 事件返回“403 Forbidden”【英文标题】:Getting CalDAV events from iCloud returns "403 Forbidden" 【发布时间】:2018-06-30 07:25:44 【问题描述】:

我正在使用SimpleCalDAV 客户端使用 php 从 iCloud (Apple) 获取日历事件。在 Apple 推出特定于应用程序的密码之前,该客户端运行良好。从那时起,对于某些用户帐户,我总是得到“403 Forbidden”:

连接到 iCloud 服务器:

请求标头:

OPTIONS / HTTP/1.1
Host: p30-caldav.icloud.com
Authorization: Basic bWFxxxxmZlbGRlckBxxxxxbmNlcHQuY2xxxxxxxxxtY3pyeC15YWZxxxxxxxx3b3o=
User-Agent: cURL based CalDAV client
Accept: */*
Content-type: text/plain

请求正文

HTTP/1.1 200 OK
Server: AppleHttpServer/2f080fc0
Date: Sun, 21 Jan 2018 15:29:33 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 0
Connection: keep-alive
X-Apple-Jingle-Correlation-Key: 3IAOX5DL3ZA5NGIXT57LTVFH3Q
apple-seq: 0
apple-tk: false
Apple-Originating-System: UnknownOriginatingSystem
X-Responding-Instance: caldavj:15701001:st41p57ic-qufb10212001:8501:17H89:22adb24b
Allow: ACL, COPY, DELETE, GET, HEAD, LOCK, MKCOL, MOVE, OPTIONS, PROPFIND, PROPPATCH, PUT, REPORT, UNLOCK
DAV: 1, access-control, calendar-access, calendar-schedule, calendar-auto-schedule, calendar-managed-attachments, calendarserver-sharing, calendarserver-subscribed, calendarserver-home-sync, calendar-audit, caldavserver-supports-telephone
X-Accept-Client-Encoding: gzip
Strict-Transport-Security: max-age=31536000; includeSubDomains
via: icloudedge:fr02p01ic-ztde011002:7401:17HotFix6:Frankfurt
X-Apple-Request-UUID: da00ebf4-6bde-41d6-9917-9f7eb9d4a7dc
access-control-expose-headers: X-Apple-Request-UUID
access-control-expose-headers: Via

尝试获取日历事件:

请求标头:

REPORT /xx76669xx5/calendars/ HTTP/1.1
Host: p30-caldav.icloud.com
Authorization: Basic ZmVsZG1hcnYuc3VwcG9ydEBnbWFpbC5jb20xxxxxxxxxxXVzLWJxbWxxxxxxxxxxxxreg==
User-Agent: cURL based CalDAV client
Accept: */*
Content-type: text/xml
Depth: 1
Content-Length: 367

请求正文:

<?xml version="1.0" encoding="utf-8" ?>
<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
<D:prop>
<C:calendar-data/>
<D:getetag/>
</D:prop><C:filter>
<C:comp-filter name="VCALENDAR">
<C:comp-filter name="VEVENT">
<C:time-range start="20180115T000000Z" end="20180121T235959Z"/>
</C:comp-filter>
</C:comp-filter>
</C:filter>
</C:calendar-query>

响应标头:

HTTP/1.1 403 Forbidden
Server: AppleHttpServer/2f080fc0
Date: Sun, 21 Jan 2018 15:49:26 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 9
Connection: keep-alive
X-Apple-Jingle-Correlation-Key: QI5L3MI7AJD6ZONONAAGCMBXZ4
apple-seq: 0
apple-tk: false
Apple-Originating-System: UnknownOriginatingSystem
X-Responding-Instance: caldavj:33000101:mr21p30ic-hpaf07173601:8501:17H89:22adb24b
DAV: 1, access-control, calendar-access, calendar-schedule, calendar-auto-schedule, calendar-audit, caldavserver-supports-telephone, calendar-managed-attachments, calendarserver-sharing, calendarserver-subscribed, calendarserver-home-sync
Strict-Transport-Security: max-age=31536000; includeSubDomains
via: icloudedge:fr02p00ic-ztde011131:7401:17HotFix6:Frankfurt
X-Apple-Request-UUID: 823abdb1-1f02-47ec-b9ae-6800613037cf
access-control-expose-headers: X-Apple-Request-UUID
access-control-expose-headers: Via

响应正文:

Forbidden

我觉得奇怪的是我可以连接到服务器(登录)并且我得到 200 响应,这意味着我能够登录到 iCloud。这似乎是用户帐户特定的问题。它适用于我的 Apple 帐户,但不适用于我的一个朋友。这可能是什么问题?

非常感谢任何提示。

【问题讨论】:

“我觉得奇怪的是我可以连接到客户端并得到 200 响应” - 您可能是指“连接到服务器”?您没有显示 URL,可能是您访问了未受保护的来源。 另外,您可能应该从问题中删除您的密码... 403 表示“内容长度:9” - 内容是什么?你省略了。 我添加了缺失的数据 好的,首先:OPTIONS 有效,因为它不需要身份验证。你打的是什么服务器,caldav.icloud.com 还是特定的分区?你是在做http还是https? 【参考方案1】:

根据this:

HTTP 状态码 403 响应是 Web 服务器被配置为拒绝客户端访问所请求资源的结果。


我预计您的朋友可能不允许您访问他的私人日历。

他必须与您share his calendar(邀请您查看日历),然后您才能使用您的帐户访问日历数据。

并且根据this documentation,不能同时将日历设置为“公共”。

最后,您还可以仔细检查 403 错误是否与this issue on your friend's side(太多 iCloud 帐户)无关

另外请注意,如果您想通过 iCloud 帐户使用第三方应用,则必须启用双重身份验证并为每个应用生成单独的密码。

【讨论】:

我认为当他们为他们的帐户提供特定于应用程序的密码时,这与分享无关。我的应用程序代表他们访问他们的日历。但是,我们只是尝试公开(共享)他们的帐户,并没有改变任何东西。我们仍然会收到来自 iCloud 的 403。 您是否尝试过您的朋友将目标日历共享到您的 iCloud 电子邮件帐户? 是的,正如我所提到的,但这不是我们服务的运作方式。我们不使用通用帐户登录。我们使用他们的应用专用密码将用户直接登录到 iCloud 服务器。

以上是关于从 iCloud 获取 CalDAV 事件返回“403 Forbidden”的主要内容,如果未能解决你的问题,请参考以下文章

ICloud Caldav连接获取日历

iCloud Caldav 连接以获取日历

iCloud日历删除事件请求不适用于caldav

如何从 Caldav 客户端为 iCloud 日历删除重复的事件条目

CALDAV 在 ICLOUD 中编辑/删除多个事件

CALDAV 在 icloud 中添加带有注释的事件