为什么不同的Microsoft Graph API返回不同的数据

时间:2019-08-29 04:20:39

标签: azure active-directory microsoft-graph

我正在使用Microsoft Graph Users API根据我们的ActiveDirectory验证用户名或电子邮件地址的列表。名称搜索:

https://graph.microsoft.com/v1.0/me/people/?$search=john.smith

返回其他数据,例如officeLocationjobTitle。但是,如果我使用电子邮件搜索:

https://graph.microsoft.com/v1.0/users/john.smith@company.com

这些其他字段为空。我已在Azure中启用以下API权限:

  • 人们阅读
  • User.Read
  • User.ReadBasic.All
  • 电子邮件

我是否需要其他权限才能获取相同的数据?

更新:我按照下面的建议在https://developer.microsoft.com/en-us/graph/graph-explorer中进行了尝试,并且可以正常运行,但是Graph Explorer默认具有以下权限,无法禁用:

  • Calendars.ReadWrite
  • Contacts.ReadWrite
  • Directory.Read.All
  • Files.ReadWrite.All
  • Mail.ReadWrite
  • Notes.ReadWrite.All
  • openid
  • 人。读
  • Sites.ReadWrite.All
  • Tasks.ReadWrite
  • User.ReadBasic.All
  • User.ReadWrite

更新2:我正在使用Python 3.7,所以我从https://github.com/microsoftgraph/python-sample-console-app/blob/master/helpers.py#L25借来了device_flow_session()。我从https://graph.microsoft.com/me/people/?$ search = John.Smith取回的数据如下:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")/people",
    "value": [{
            "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
            "displayName": "John Smith",
            "givenName": "John",
            "surname": "Smith",
            "birthday": "",
            "personNotes": "",
            "isFavorite": False,
            "jobTitle": "Software Engineer",
            "companyName": "Company",
            "yomiCompany": "",
            "department": "Fish",
            "officeLocation": "London",
            "profession": "",
            "userPrincipalName": "John.Smith@company.com",
            "imAddress": "sip:John.Smith@company.com",
            "scoredEmailAddresses": [{
                    "address": "John.Smith@company.com",
                    "relevanceScore": -6.0991198031917175,
                    "selectionLikelihood": "notSpecified"
                }
            ],
            "phones": [],
            "postalAddresses": [],
            "websites": [],
            "personType": {
                "class": "Person",
                "subclass": "OrganizationUser"
            }
        }
    ]
}

https://graph.microsoft.com/users/John.Smith@company.com中的数据为:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity",
    "businessPhones": [],
    "displayName": "John Smith",
    "givenName": "John",
    "jobTitle": None,
    "mail": "John.Smith@company.com",
    "mobilePhone": None,
    "officeLocation": None,
    "preferredLanguage": None,
    "surname": "Smith",
    "userPrincipalName": "John.Smith@company.com",
    "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

2 个答案:

答案 0 :(得分:1)

图中的每个“服务”(Active Directory,Exchange,SharePoint等)都对数据做出决策,以默认情况下在调用中返回。这些决定是最适合Microsoft运行服务的,而不一定是呼叫者需要的。 ;)建议添加$select参数以指定所需的属性。

来自https://docs.microsoft.com/en-us/graph/query-parameters#select-parameter

  

重要提示:通常,我们建议您使用$ select来限制   查询返回给应用所需的属性。这是   尤其是对于可能返回较大值的查询   结果集。限制每一行中返回的属性将减少   网络负载并帮助改善应用程序的性能。

     

在v1.0中,一些从directoryObject派生的Azure AD资源,   如用户和组,返回一个有限的默认属性子集   读。对于这些资源,必须使用$ select返回属性   超出默认设置。

答案 1 :(得分:1)

根据我的测试,我发现这两个API所获得的信息来自不同的地方。

/me/people返回的

“ officeLocation”似乎已在SharePoint中维护。您可以登录https://apc.delve.office.com/?u=3df5295a-e4b1-46fe-8969-e715ccd11077&v=editprofile进行检查。

/me/users/{id | userPrincipalName}返回的

“ officeLocation”在Azure AD中维护。因此,您可以在Azure AD->用户中对其进行检查。

在Azure AD中更新“ Office”后,将使用两个终结点进行查询。但是他们给了我两个不同的结果。一个(/me/people)很旧,另一个(/users/{id | userPrincipalName})很新。可能需要一些时间才能同步。也许他们不会同步。

我也在Microsoft Graph Explorer中对其进行了测试。而且“ officeLocation”也不同。因此,我不确定Microsoft Graph Explorer为什么适合您。但是您可以将其与我的想法一起挖掘。

我希望我的发现对您有帮助。