使用 MS Graph API 获取共享日历所有者的用户 ID

Get UserId of shared calendar's owner using MS Graph API

我想 get the User's profile 与我共享日历,但此呼叫需要 iduserPrincipalName:

GET /users/{id | userPrincipalName}

仅限共享日历returns:

{
    "id": "**********************************************=",
    "name": "Lala Lalala",
    "color": "auto",
    "changeKey": "Epg+nQ9k3kuTN16cfoLtwAAAsZgDvA==",
    "canShare": false,
    "canViewPrivateItems": false,
    "canEdit": true,
    "owner": {
        "name": "Lala Lalala",
        "address": "Lalala@outlook.com"
    }
}

那么如何获取共享日历所有者的 iduserPrincipalName

没有直接的方法来实现你想要的。但是你可以通过两步获取id或者userPrincipalName:

  1. 获取所有者不是您的日历,如您发布的回复(official docs):

    https://graph.microsoft.com/v1.0/me/calendars

  2. 使用所有者中的地址调用以下API:

    https://graph.microsoft.com/v1.0/users/{地址}

带有 iduserPrincipalName 的响应:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity",
    "id": "5eec0ff7-b007-48c4-87ae-7cddb085f234",
    "businessPhones": [],
    "displayName": "...",
    "givenName": "...",
    "jobTitle": null,
    "mail": "test@test.com",
    "mobilePhone": "8612345678",
    "officeLocation": "No WorkSpace",
    "preferredLanguage": null,
    "surname": "s",
    "userPrincipalName": "test@test.com"
}

对于 Work/School 个帐户(Azure AD 租户),userPrincipalName 是所有者的地址(即 alias@aad.domain.com):

"owner": {
    "name": "Lala Lalala",
    "address": "Lalala@outlook.com"
}

假设他们与您在同一个租户中,您可以使用 GET https://graph.microsoft.com/v1.0/users/{owner.address} 检索他们的个人资料。

重要提示:但这不适用于个人帐户 (MSA/Outlook.com)。我之所以提到这一点,是因为您的示例使用 Lalala@outlook.com 作为 address

由于 Outlook.com 实际上是 "single user" 租户,您可以检索的 唯一 用户是您自己 (/me)。正如您无法从另一家公司的 AAD 访问用户数据一样,您也无法检索另一个 Outlook.com 用户的个人资料。如果你考虑到我访问你的个人联系信息的代价高昂的影响,那么这条规则就位是有道理的。