【问题标题】:Calendar Id randomly changed日历 ID 随机更改
【发布时间】:2021-02-04 10:43:45
【问题描述】:

使用 microsoft graph 时让日历更改其 id 的原因是什么???

今天发生这种情况,我们的一位客户已经使用他的主日历 2 年多了,今天突然,id 发生了变化,我们无法添加任何事件,因为我们有“旧”id

被调用的端点:

/me/calendars/AAMkAGFmMzAxNmRkLTg4YTEtNDNhZS1iYjExLWE1OThlYThlNTRmOQBGAAAAAACxNL6zUoo_Qr9AY8vFoIfmBwBstbpyrelbSJu1keAu6bMkAAAAAAEGAABstbpyrelbSJu1keAu6bMkAAAAAFB8AAA=/events

返回错误:

{
  "error": {
    "code": "ErrorItemNotFound",
    "message": "The specified object was not found in the store."
  }
}

标题:

{
  "Cache-Control": [
    "private"
  ],
  "Content-Type": [
    "application/json; odata.metadata=minimal; odata.streaming=true; IEEE754Compatible=false; charset=utf-8"
  ],
  "request-id": [
    "63353567-4ebd-4b25-903b-d66717797882"
  ],
  "client-request-id": [
    "63353567-4ebd-4b25-903b-d66717797882"
  ],
  "x-ms-ags-diagnostic": [
    "{\"ServerInfo\":{\"DataCenter\":\"North Europe\",\"Slice\":\"SliceC\",\"Ring\":\"4\",\"ScaleUnit\":\"001\",\"RoleInstance\":\"AGSFE_IN_6\"}}"
  ],
  "Strict-Transport-Security": [
    "max-age=31536000"
  ],
  "Date": [
    "Thu, 04 Feb 2021 10:40:39 GMT"
  ],
  "Content-Length": [
    "99"
  ]
}

新日历 ID:AAMkAGFmMzAxNmRkLTg4YTEtNDNhZS1iYjExLWE1OThlYThlNTRmOQBGAAAAAACxNL6zUoo_Qr9AY8vFoIfmBwBstbpyrelbSJu1keAu6bMkAAAAAAEGAABstbpyrelbSJu1keAu6bMkAAF8qLRIAAA=

编辑:(发生在另一个客户身上) 今天与另一个客户(另一个租户 ID)再次发生这种情况,以下是详细信息:

旧日历 ID:

AAMkAGI2Y2NkYzVmLTc3ZjUtNDQyNi1iNjIzLTljNjkyMDk5YjEyYwBGAAAAAADQqVqZh-ZpQJl-EcoJBivzBwCE3CCn1SYkSLnEBiNMaH3ZAAAAAAEGAACE3CCn1SYkSLnEBiNMaH3ZAAAAAB08AAA=
{
   "Cache-Control":[
      "private"
   ],
   "Content-Type":[
      "application\/json; odata.metadata=minimal; odata.streaming=true; IEEE754Compatible=false; charset=utf-8"
   ],
   "request-id":[
      "2f9ddb93-3594-4d86-97f9-d7dbe960a2bb"
   ],
   "client-request-id":[
      "2f9ddb93-3594-4d86-97f9-d7dbe960a2bb"
   ],
   "x-ms-ags-diagnostic":[
      "{\"ServerInfo\":{\"DataCenter\":\"North Europe\",\"Slice\":\"SliceC\",\"Ring\":\"4\",\"ScaleUnit\":\"001\",\"RoleInstance\":\"AGSFE_IN_71\"}}"
   ],
   "Strict-Transport-Security":[
      "max-age=31536000"
   ],
   "Date":[
      "Mon, 08 Feb 2021 11:08:53 GMT"
   ],
   "Content-Length":[
      "99"
   ]
}

新日历 ID:

AAMkAGI2Y2NkYzVmLTc3ZjUtNDQyNi1iNjIzLTljNjkyMDk5YjEyYwBGAAAAAADQqVqZh-ZpQJl-EcoJBivzBwCE3CCn1SYkSLnEBiNMaH3ZAAAAAAEGAACE3CCn1SYkSLnEBiNMaH3ZAAGPkTa6AAA=

【问题讨论】:

  • 有趣的线程/信息...您可能需要与 Microsoft 支持联系,看看他们在这方面的立场。
  • 不知道为什么会这样,但您也可以使用/me/calendars端点并获取所需的calendarid,然后尝试通过/me/calendars/claendarid/events创建事件。
  • @ShivaKeshavVarma 不幸的是,使用新的日历 ID 并不是一个好的解决方案。由于我们会丢失我们存储的每个应用程序特定信息(比如存储在我们应用程序中的事件与其他表有关系。如果我只是添加新日历,我认为每个事件的 iCalUID 也会不同,因此我们失去事件在我们的应用程序中的所有关系,我们最终只会得到像 Outlook 中这样的普通事件)
  • 在不知道给定邮箱的历史记录的情况下很难评论 - 问题可能是由于邮箱历史记录/迁移/索引或邮箱重新创建等而发生的。这里的 Graph API 只是返回的信使给你。如果源中存在问题,则它将仅共享数据。正如我之前更新的那样,您可能想尝试该方法或使用 iCalUID 来查看它是否适合您的场景。但是是的,它可能仅适用于新物品,对于旧物品,您可能需要盖章并使用它们。

标签: microsoft-graph-api outlook-restapi microsoft-graph-calendar


【解决方案1】:

这是一个难题......这些看起来是 Base64 编码的。如果您使用 Base 64 解码旧 ID 和新 ID,您会发现其中嵌入了相同的 GUID。

(使用https://www.base64decode.org/

Old decoded: $af3016dd-88a1-43ae-bb11-a598ea8e54f9F4R?B@cŠlr[H.$lr[H.$P|
New decoded: $af3016dd-88a1-43ae-bb11-a598ea8e54f9F4R?B@cŠlr[H.$lr[H.$|H
(guid: af3016dd-88a1-43ae-bb11-a598ea8e54f9)
- 
2nd example provided 
Old decoded: $b6ccdc5f-77f5-4426-b623-9c692099b12cFЩZi@~    + &$H#Lh} &$H#Lh}<
New decoded: $b6ccdc5f-77f5-4426-b623-9c692099b12cFЩZi@~    + &$H#Lh} &$H#Lh}6
(guid: b6ccdc5f-77f5-4426-b623-9c692099b12c)

如果无法通过图形请求中的查询使用嵌入的 GUID,那么可以调用 https://graph.microsoft.com/v1.0/me/calendars,解码所有日历,找到具有匹配嵌入 GUID 的 ID,然后使用那个?它会增加一个额外的调用,但您可以在异常处理中进行,因为不需要状态。这可能对您现有的应用程序有所帮​​助。

我不能保证这会奏效,因为随着时间的推移,我没有数据来测试这个理论……但你可以:)

为避免以后 ID 更改出现此问题,请尽可能存储 immutable IDs。您不能将它们存储为容器(日历、邮箱等),但也许向前移动您可以将它们存储为您的应用程序创建的事件,这样您就可以从那里向后工作。

容器类型(mailFolder、日历等)不支持不可变 ID,但它们的常规 ID 已经是常量。

他们文档中的这一行值得注意,因为您的经验与他们的文档所述不符。这为您向 MS 投诉或向您的客户提出 IBM 投诉提供了空间(IBM:I Blame Microsoft)。

另外,我会问这两个组织的 IT 是否更改了与 AAD Sync 或 Exchange 相关的任何内容?我有一个与此有关的疯狂理论。最近有一封电子邮件要求人们更新 AAD 同步,这种模式对某种身份验证提供程序的更改感觉很熟悉。

【讨论】:

  • 不知道日历的 ID 包含基于 64 编码的 GUID。这是否也意味着日历 ID 在整个 Microsoft 租户中是唯一的,而不仅仅是特定用户/邮箱?我遇到了类似的要求,我真的需要在我的多用户、多租户应用程序中识别唯一的 Microsoft 日历。我不确定使用 Id 是否足够。
  • 嗯,我不知道。微软用 GUID 做了该死的怪事。一定要尝试在文档中找到你正在做的事情的基础。
【解决方案2】:

问题不在于日历 ID 已更改。看起来你只需要处理它,并且你有一个很好的方法来找到新的 ID,如上面的评论所述。

问题是您在应用中使用 Microsoft 生成的 ID,但现在它们不匹配。向事件(或用户/组)添加额外数据是完全可能的。有关更多信息,请参阅this 页面。这样您就可以在创建时将您的外部 ID 添加到事件中,然后您始终可以找到该事件。

【讨论】:

  • 嗯,是的,在大多数现有 API 上总是可以做到这一点,但关键是日历的公共 ID 应该扮演唯一和不可变的角色。当然,总有一些变通方法,但它涉及更多的工作,这些工作一开始就不应该发生。我的意思是,如果 API 随机更改,为什么还要返回 id..
  • 如果它们几年都保持不变,它们对我来说似乎很静止。如果您有一个使用 int 作为项目键的 Web 应用程序。然后你决定它必须是一个向导。要迁移,您必须更改所有现有 id,但您仍然可以将 id 称为唯一且不可变的。
猜你喜欢
  • 2021-10-13
  • 1970-01-01
  • 2022-07-01
  • 2019-11-08
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
相关资源
最近更新 更多