【问题标题】:MSAL with Graph API带有图形 API 的 MSAL
【发布时间】:2021-04-02 16:14:04
【问题描述】:

我正在尝试构建 Java 代码以使用 MSAL 和 MS Graph API 在 AAD 中创建用户。下面是我用来创建用户的代码。我能够成功检索令牌,但是在尝试发布请求时出现异常。我做错了什么?

public static void main(String[] args) throws Exception {
         Map<String,Object> params = new LinkedHashMap<>();      
         params.put("givenName", "Test");
         params.put("displayName", "ABC");
         params.put("accountEnabled", true);
         params.put("mailNickname","abc");
         params.put("userPrincipalName","jcooper@demo.onmicrosoft.com");    
         StringBuilder postData = new StringBuilder();
         for (Map.Entry<String,Object> param : params.entrySet()) {
             if (postData.length() != 0) postData.append('&');
             postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
             postData.append('=');
             postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
         }
         byte[] postDataBytes = postData.toString().getBytes("UTF-8");
int length =postDataBytes.length;
        URL url = new URL("https://graph.microsoft.com/v1.0/users");
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
      conn.setRequestMethod("POST");
      conn.setRequestProperty("Content-Type","application/json");
      conn.setRequestProperty("Authorization", "Bearer "+accessToken);
      conn.setDoInput(true);
      conn.setDoOutput(true);
      conn.setInstanceFollowRedirects(false);
       conn.setRequestProperty("Content-Length",Integer.toString(length));
        conn.connect();      
        conn.getInputStream();
        try (var wr = new DataOutputStream(conn.getOutputStream())) {
            wr.write(postDataBytes);
        }
        StringBuilder content;     
        System.out.println(postDataBytes+" "+postData);
        try (var br = new BufferedReader(
                new InputStreamReader(conn.getInputStream()))) {
            String line;
            content = new StringBuilder();
            while ((line = br.readLine()) != null) {
                content.append(line);
                content.append(System.lineSeparator());
            }
       }
        System.out.println(content.toString());
    }   

异常:线程“主”java.io.IOException 中的异常:服务器返回 HTTP 响应代码:411 用于 URL:https://graph.microsoft.com/v1.0/users

【问题讨论】:

  • (1) 如果您使用的是 Java 版 MSAL,那么您可以启用跟踪/内置遥测日志记录,以查看您在哪个 API 调用中看到了问题。 (2) 分享你得到的详细错误/跟踪

标签: java azure azure-active-directory microsoft-graph-api msal


【解决方案1】:

根据一些测试,我遇到了同样的问题。似乎代码是正确的,但不知道为什么它仍然显示 411 错误。这可能是由于图形 api 只能接受 json 请求正文,但您在代码的第一部分将请求正文转换为 application/x-www-form-urlencoded(我不确定,因为我用 json 请求正文测试代码但仍然显示 411) .

由于您提到使用 MSAL 获取访问令牌,您还可以继续使用 MSAL 来创建用户。请参考这个example

GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider( authProvider ).buildClient();

User user = new User();
user.accountEnabled = true;
user.displayName = "Adele Vance";
user.mailNickname = "AdeleV";
user.userPrincipalName = "AdeleV@contoso.onmicrosoft.com";
PasswordProfile passwordProfile = new PasswordProfile();
passwordProfile.forceChangePasswordNextSignIn = true;
passwordProfile.password = "xWwvJ]6NMw+bWH-d";
user.passwordProfile = passwordProfile;

graphClient.users()
    .buildRequest()
    .post(user);

【讨论】:

  • 一个问题....哪个应该是首选方法,使用 MSAL 或 graphClient 作为访问令牌?
  • @SushmitaDas 很抱歉没有清楚地描述解决方案。如果您使用 MSAL,则无需在代码中获取访问令牌。您可以从此document 中选择身份验证提供程序,例如“客户端凭据提供程序”。然后继续使用我上面提供的 MSAL 代码来创建用户。
  • 我需要您的帮助来了解您提供的参考链接和link 之间的区别。后者使用 MSAL 获取访问令牌,前者使用客户端凭据流作为身份验证提供程序。两者有什么区别?推荐哪一个?
  • @SushmitaDas 抱歉延迟回复。他们都可以实现需求,并且在后端几乎相同。不同之处在于我提供的第一个示例没有在代码中获取访问令牌。但实际上graphClient 已经包含了访问令牌,所以它可以进行获取/创建用户操作。您提供的第二个链接在代码中获取访问令牌,然后使用 HTTP 请求执行相同的操作(获取/创建用户)。
  • 嗨@SushmitaDas 关于这篇文章的任何更新或任何其他问题?如果没有其他问题,请您将答案标记为“已接受”,提前谢谢。
【解决方案2】:

为了从桌面应用程序访问 Microsoft Graph,我会使用 InteractiveBrowserCredentialBuilder() 和 GraphSDK 附带的 TokenCredentialAuthProvider 来获取 Graph 令牌。看看伟大的sample code here。您需要做的就是更改最后一行并根据您需要调用的 Graph API 以不同方式设置范围。该页面底部有一个链接,可教您正确注册应用。

Web 应用 中最简单的方法是使用 Azure AD Spring Boot Starter 获取登录用户的访问令牌,并使用 GraphSDK 调用 Graph在 Spring 5 网络应用程序中。请参阅this sample,它演示了这一点以及完整的说明(相关图形代码在 SampleController.java 和 Utilities.java 中)

【讨论】:

    猜你喜欢
    • 2016-01-29
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2022-09-30
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多