【问题标题】:Unable to Auth MS Graph using MSAL4J username-password flow无法使用 MSAL4J 用户名-密码流验证 MS Graph
【发布时间】:2020-06-22 21:42:35
【问题描述】:

我有一个 Java (Spring Boot) 应用程序(不是 Web 应用程序,只有后端应用程序),我正在尝试从中调用 Microsoft Graph API 以通过我的应用程序发送邮件。

代码运行一个 Cron 调度程序,在每天的固定时间发送邮件。我的应用没有可以要求用户手动登录的 UI。

Java 代码使用服务帐户进行身份验证。服务帐号是工作帐号,而不是个人帐号。

我正在使用MSAL4J 库,并且我已经在 Azure Active Directory 中设置了相关步骤,如其中所述。

我只有委托访问权限,没有应用程序访问权限。而且,我正在使用Username-Password Flow 使用服务帐户进行身份验证。

这是我正在使用的示例Code

我可以在我的笔记本电脑上本地运行代码,该笔记本电脑位于组织“公司”网络 (VPN) 中。

现在,当我将应用程序部署到 AWS kubernetes 集群(在我的组织“corp”网络之外)时,我从 MSAL4J 库中收到此错误:

org.xml.sax.SAXParseException: The element type "br" must be terminated by the matching end-tag "</br>".
       at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:261) ~[na:na]
       at java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339) ~[na:na]
       at java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:122) ~[na:na]
       at com.microsoft.aad.msal4j.MexParser.getPolicy(MexParser.java:76) ~[msal4j-1.4.0.jar!/:1.4.0]
       at com.microsoft.aad.msal4j.MexParser.getWsTrustEndpointFromMexResponse(MexParser.java:112) ~[msal4j-1.4.0.jar!/:1.4.0]
       at com.microsoft.aad.msal4j.WSTrustRequest.execute(WSTrustRequest.java:62) ~[msal4j-1.4.0.jar!/:1.4.0]
       at com.microsoft.aad.msal4j.AcquireTokenByAuthorizationGrantSupplier.processPasswordGrant(AcquireTokenByAuthorizationGrantSupplier.java:76) ~[msal4j-1.4.0.jar!/:1.4.0]
       at com.microsoft.aad.msal4j.AcquireTokenByAuthorizationGrantSupplier.execute(AcquireTokenByAuthorizationGrantSupplier.java:33) ~[msal4j-1.4.0.jar!/:1.4.0]
       at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:59) ~[msal4j-1.4.0.jar!/:1.4.0]
       at com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:17) ~[msal4j-1.4.0.jar!/:1.4.0]
       at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700) ~[na:na]
       at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

错误来自以下代码line

result = pca.acquireToken(parameters).join();

MSAL4J 库没有任何调试日志,也无法确定导致此错误的原因。

有人可以帮忙找出问题所在吗?

【问题讨论】:

    标签: java azure-ad-graph-api msal


    【解决方案1】:

    我尝试了您使用的示例代码,但没有收到此错误。令牌和用户名打印在控制台上。

    错误通常是由编码引起的。调试您的代码并检查 XML 的编码。

    【讨论】:

      【解决方案2】:

      端点返回的数据不是有效的 XML。这可能是因为您无法从公司网络外部到达端点。

      您应该考虑使用client credentials flow,而不是用户名密码。 This article 解释了为什么不应该使用用户名密码。

      切换到客户端凭据可能会解决您的问题,因为您不必调用用户名密码调用的 WS-Trust 端点。

      【讨论】:

      • 谢谢!大概就是这样,我将尝试实现客户端凭据流程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多