oauth-2.0 如何使用HttpURLConnection通过Java使用Microsoft Graph API按appId获取应用程序

mrfwxfqh  于 2022-10-31  发布在  Java
关注(0)|答案(3)|浏览(148)

我想授权Azure Active Directory授予的OAuth JSON Web令牌,我需要做的一件事是使用Microsoft Graph API在令牌的appId中获取有关应用程序的更多信息。
Microsoft Graph API允许我通过以下方式按ID获取应用程序

https://graph.microsoft.com/beta/applications/{id}

,而不是通过其appId

https://graph.microsoft.com/beta/applications/{appId}

我认为使用Microsoft Graph API获取使用AppId的应用程序的最佳方法是通过如下过滤器:

https://graph.microsoft.com/beta/applications?filter=appId eq '{appId}'

上面的过滤器在Microsoft Graph Explorer中工作正常,但是当使用HttpUrlConnection通过GET请求调用Graph API时,我的请求失败,并显示HTTP代码400和消息“Bad Request”。
这很奇怪,因为使用完全相同的HttpUrlConnection通过

https://graph.microsoft.com/beta/applications

工作正常。
筛选器功能是否存在某些问题,使我无法在Microsoft Graph API GET请求中使用它?我应如何通过应用程序的AppId获取有关应用程序的信息?
下面是我在HttpURLConnection中使用的Java代码片段:

url = new URL(String.format("https://graph.microsoft.com/beta/applications?filter=appId eq '%s'", appId));
        final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Authorization", "Bearer " + result.getAccessToken());
        conn.setRequestProperty("Accept", "application/json");
        conn.setRequestProperty("Content-Type", "application/json");

        final int httpResponseCode = conn.getResponseCode();
        if (httpResponseCode == 200 || httpResponseCode == 201) {
            BufferedReader in = null;
            final StringBuilder response;
            try {
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream()));
                String inputLine;
                response = new StringBuilder();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
            } finally {
                in.close();
            }
            final JSONObject json = new JSONObject(response.toString());
            return json.toString(4);
        } else {
            return String.format("Connection returned HTTP code: %s with message: %s",
                    httpResponseCode, conn.getResponseMessage());
        }
von4xj4u

von4xj4u1#

如果您正在使用GraphServiceClient,则可以执行以下操作,以防其他人找到此问题:

var appId = "some app id";

var response = await _graphClient.Applications
    .Request()
    .Filter($"appId eq '{appId}'")
    .GetAsync();

var azureAddApplication = response.FirstOrDefault() ?? throw new ArgumentException($"Couldn't find App registration with app id {appId}");
mu0hgdu0

mu0hgdu02#

如果有人在搜索此... API调用应使用应用的对象ID,而不是应用ID。

umuewwlo

umuewwlo3#

您应该对查询参数进行URLEncode。

String url2=URLEncoder.encode("$filter=appId eq '{applicationId}'");
URL url = new URL("https://graph.microsoft.com/beta/applications?"+url2);

相关问题