Azure active directory 通过图形API访问Office 365

Azure active directory 通过图形API访问Office 365,azure-active-directory,microsoft-graph-api,Azure Active Directory,Microsoft Graph Api,关于通过Microsoft Graph API访问我的office 365帐户,我有一个(或两个)问题 第一个问题是,我有一个java程序试图列出office 365订阅中的所有用户。我正在呼叫https://graph.microsoft.com/v1.0/users/但禁止返回403 在应用程序注册中,我添加了授权和应用程序权限的权限,包括User.Read、User.ReadBasic.All、User.ReadWrite 我也尝试过使用Graph Explorer,但当我输入使用我的帐户

关于通过Microsoft Graph API访问我的office 365帐户,我有一个(或两个)问题

第一个问题是,我有一个java程序试图列出office 365订阅中的所有用户。我正在呼叫
https://graph.microsoft.com/v1.0/users/
但禁止返回
403

在应用程序注册中,我添加了授权和应用程序权限的权限,包括
User.Read
User.ReadBasic.All
User.ReadWrite

我也尝试过使用Graph Explorer,但当我输入使用我的帐户时,它仍然使用内置的Graph用户,并且不显示我的应用程序登录信息。不确定这些是否相关

下面是导致403错误的代码片段

AuthenticationResult result = getAccessTokenFromUserCredentials(RESOURCE_GRAPH, ID, PASSWORD);

URL url = new URL("https://graph.microsoft.com/v1.0/users/")   ;

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
conn.setRequestProperty("Authorization", "Bearer "+result.getAccessToken());
if (conn.getResponseCode() != 200) {
    throw new RuntimeException("Failed : HTTP error code : "
            + conn.getResponseCode());
}
下面是获取令牌的方法

private static AuthenticationResult getAccessTokenFromUserCredentials(String resource,
                                                                          String username, String password) throws Exception {
        AuthenticationContext context;
        AuthenticationResult result = null;
        ExecutorService service = null;
        try {
            service = Executors.newFixedThreadPool(1);
            context = new AuthenticationContext(AUTHORITY, false, service);
            Future<AuthenticationResult> future = context.acquireToken(
                    resource, CLIENT_ID, username, password,
                    null);
            result = future.get();
        } finally {
            service.shutdown();
        }

        if (result == null) {
            throw new ServiceUnavailableException(
                    "authentication result was null");
        }
        return result;
    }
私有静态身份验证结果getAccessTokenFromUserCredentials(字符串资源、,
字符串用户名、字符串密码)引发异常{
认证上下文;
AuthenticationResult=null;
ExecutorService=null;
试一试{
服务=Executors.newFixedThreadPool(1);
context=新的AuthenticationContext(AUTHORITY、false、service);
Future=context.acquireToken(
资源、客户端ID、用户名、密码、,
无效);
结果=future.get();
}最后{
service.shutdown();
}
如果(结果==null){
抛出新ServiceUnavailableException(
“验证结果为空”);
}
返回结果;
}

apps.dev.microsoft.com中的应用程序注册可与v2.0端点一起使用。有关v2.0端点的详细信息,请单击此处


您可以使用和获取令牌。在身份验证期间,您需要对user.ReadBasic.All权限进行用户同意或管理员同意。同意后,访问令牌包括该委托权限,并将在调用列表用户操作时起作用。

好的,我想我应该发布答案。首先,也是最令人困惑的是,apps.dev.microsoft.com注册似乎不起作用(即使我使用的是V2.0端点和版本2库)

然而,当我直接使用azure门户注册应用程序时,这就解决了这个问题。我随后能够正确访问该服务

奇怪的是,虽然身份验证/授权服务是我的应用程序的标准服务,并且在访问Sharepoint/One Drive等方面非常有效,但是,当想要访问用户端点时,它只有在portal.azure.com中注册才能起作用


非常感谢大家的帮助。

您如何验证用户以获得您传递给
/users
的令牌?使用代码示例更新。如果我调用,我将返回代表我的用户的json字符串。但是如果我用/users/打电话,我会得到403。我还可以访问sharepoint端点确定并获取网站数据等。User.ReadBasic.All需要管理员同意,您是否尝试过进行管理员同意?你在哪里注册该应用程序,在azure门户中?它在apps.dev.microsoft.com上注册,然后它也在azure门户中的“我的用户”下显示为应用程序。不过,当我在azure中查看时,它会将其列为默认访问权限。但当我列出权限时,它会告诉我,我已经阅读了用户同意书和管理员同意书。该应用程序声明其访问权限为用户同意。我在哪里可以更改此设置?不幸的是,我使用的是v2.0端点和库,但这似乎是应用程序的问题。注册门户。