我想在我们的网络应用程序中发布一个日历,以便客户可以使用他们最喜欢的软件订阅它——谷歌日历、Outlook.com 等。
我正在从我们的数据库中提取数据并使用 sabre/dav 的 VObject 类创建一个 ics 文件,然后通过 url 提供它:
webcal://www.server.com/calendar.php?username=john.doe&cal_id=efccd95ee22917d327e31840fbc1a97936a4
这适用于 Google Calendar 和 Thunderbird,但不适用于 Outlook.com,它显然试图做一些涉及 Oauth 2 的“现代身份验证”(是的,这就是所谓的)。没有错误,但也没有事件。我假设这是阻止它工作的原因:
https://support.microsoft.com/en-gb/help/4025591/you-can-t-add-an-internet-calendar-in-outlook
据我所知,这不是同步间隔问题,因为:
- 这些事件最初不会出现在 Outlook 365 中
- 即使过了 24 小时他们也没有出现
有人问了一个类似的问题,但没有得到答案:
我捕获了 Outlook 发送到我的服务器的 HTTP 请求标头,除了用户代理“Exchange”之外,它是一个没有额外标头的标准请求。
Microsoft 似乎没有准确记录 Outlook 365 的预期。
有一种解决方法说订阅时使用 OWA(Outlook Web Access),我认为这只适用于企业客户。
以下是我的服务器的响应。
卷曲输出:
< HTTP/1.1 200 OK
< Date: Mon, 22 Jul 2019 17:52:59 GMT
< Server: Apache/2.4.18 (Ubuntu)
< Content-Length: 648
< Content-Type: text/calendar;charset=UTF-8
<
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Sabre//Sabre VObject 4.2.0//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:sabre-vobject-f1337426-242c-4c5f-a7af-199ff6aa68d9
DTSTAMP:20190722T175259Z
SUMMARY:Super Event
DTSTART:20190716T131500
DTEND:20190716T191500
END:VEVENT
… ETC。
END:VCALENDAR
预期的结果是,订阅后,事件被添加到 Outlook 365 日历,实际结果是没有事件被添加。
我很高兴知道 Microsoft 使用什么机制来决定是否使用 Modern Auth,然后告诉它不,我不想使用任何身份验证。
编辑:
我研究了使用CalDAV,最终得出结论,微软和谷歌都希望集成商使用OAuth 2进行身份验证,然后通过已发布的 API 访问他们的日历(谷歌可以选择为此提供CalDAV接口)。