php - 从 iCloud 获取 CalDAV 事件返回 "403 Forbidden"

标签 php curl calendar icloud caldav

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

连接到 iCloud 服务器:

请求 header :

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

尝试获取日历事件:

请求 header :

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>

响应 header :

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 帐户,但不适用于我 friend 的帐户。这可能是什么问题?

非常感谢任何提示。

最佳答案

根据 this :

HTTP status code 403 responses are the result of the web server being configured to deny access to the requested resource by the client.


我想您的 friend 可能不允许您访问他的私有(private)日历。

他必须share his calendar在您可以使用您的帐户访问日历数据之前与您(邀请您查看日历)。

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

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

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

关于php - 从 iCloud 获取 CalDAV 事件返回 "403 Forbidden",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48368458/

相关文章:

java - 日历秒数在 while 循环中没有增加

java - 检查 Date 对象是否在过去 24 小时内发生

使用外部主机名时 PHP 响应缓慢

php - 为什么我的 twilio Web 应用程序可以在 XAMPP 中运行,但不能在 AZURE 中运行

php - 即使字符串分隔符为空,如何对字符串值进行 CamelCase?

在 c 中使用线程的 Curl 客户端会产生随机行为吗?

json - 在elasticsearch和Kibana中导入.log文件

Java:GregorianCalendar 返回错误的数据

php - 将PHP异常和错误记录到数据库表PHP Slim 3中

php - lattice levelplot 仅在 RApache 下失败