通过 Graph API 查找用户失败,并显示“引用属性对象不存在”

问题描述 投票:0回答:1

我正在尝试使用以下代码通过 Graph API 版本 6.5.0 查找用户:

graphClient.users().byUserId("[email protected]").get()

但是我的查找失败了

com.microsoft.graph.models.odataerrors.ODataError: Resource '[email protected]' does not exist or one of its queried reference-property objects are not present.

我可以使用如下代码在用户 Outlook 日历中创建日历事件:

graphClient.users()
            .byUserId("[email protected]")
            .calendar()
            .events()
            .post(theEvent);

我猜测问题在于“其查询的引用属性对象之一不存在”。但我不知道这意味着什么。

我在正在使用的应用程序客户端上设置了以下权限:

  • 应用程序.读取全部
  • 日历.阅读
  • 日历.读写
  • 用户.阅读
  • 用户.阅读.全部
azure microsoft-graph-api
1个回答
0
投票

如果您正在查询的用户不存在于 Microsoft Entra ID 租户中,通常会出现错误 “资源 '[email protected]' 不存在或其查询的引用属性对象之一不存在” .

enter image description here

  • 正如您所说您可以通过传递用户的 UPN 来创建日历事件,这可能是您没有为用户 API 调用传递有效的 UPN 的问题。

在我的环境中,我创建了一个 Microsoft Entra ID 应用程序 并授予了

User.Read.All
API 权限,这是调用用户 API 所需的。

enter image description here

我使用了以下代码,能够使用 Microsoft Graph API 版本 6.5.0 成功获取用户详细信息:

package com.example;

import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.microsoft.graph.models.User;
import com.microsoft.graph.serviceclient.GraphServiceClient;

public class GraphApiExample {

    public static void main(String[] args) {

        final String clientId = "ClientID";
        final String tenantId = "TenantID";
        final String clientSecret = "ClientSecret";
        final String userId = "[email protected]";

        final String[] scopes = new String[] { "https://graph.microsoft.com/.default" };

        final ClientSecretCredential credential = new ClientSecretCredentialBuilder()
                .clientId(clientId)
                .tenantId(tenantId)
                .clientSecret(clientSecret)
                .build();

        if (null == scopes || null == credential) {
            throw new RuntimeException("Unexpected error");
        }
        final GraphServiceClient graphClient = new GraphServiceClient(credential, scopes);

        try {
            // Get the user by userId (email or userPrincipalName)
            User user = graphClient.users().byUserId(userId).get();

            System.out.println("User ID: " + user.getId());
            System.out.println("User Display Name: " + user.getDisplayName());

        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

enter image description here

如果问题仍然存在,请检查以下内容:

  • 确保您传递的是 用户的用户主体名称

enter image description here

  • 或者尝试传递用户的对象 ID 来查询而不是 UPN。
  • 确保用户存在并在 Azure AD 中正确配置为如果用户在 Azure Active Directory 中不存在,您将收到此错误。您可以仔细检查该用户是否存在。
  • 使用 Microsoft Graph Explorer 仔细检查用户是否存在
  • 检查您是否通过电子邮件而不是通过
    UPN
    查询用户。
  • 如果用户属于另一个租户,则配置应用程序和多租户并尝试。

否则,请尝试调用

UserCollectionResponse result = graphClient.users().get();
列出租户中所有用户的 API (而不是等待客户) 并检查您正在查询的用户是否存在。当您向应用程序授予
User.Read.All
API 权限时,此 API 将正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.