Java 如何使用基于管理证书的身份验证对Azure进行REST API调用?
我正在尝试使用java应用程序从Microsoft Azure获取使用情况和费率卡信息,我逐渐了解到我可以使用管理证书来验证是否可以拨打Microsoft Azure 我从.publishsettings文件中获得了管理证书 但是,在Java 如何使用基于管理证书的身份验证对Azure进行REST API调用?,java,azure,adal,azure-billing-api,Java,Azure,Adal,Azure Billing Api,我正在尝试使用java应用程序从Microsoft Azure获取使用情况和费率卡信息,我逐渐了解到我可以使用管理证书来验证是否可以拨打Microsoft Azure 我从.publishsettings文件中获得了管理证书 但是,在AuthenticationContext中,我没有看到任何方法利用此证书来获取进行使用和评级API调用所需的访问令牌 我试图引用,但我没有看到任何可用于使用率和费率卡的客户机,答案是ManagementClient,它不适用于我的用例。我也提到了这个博客,它提到了
AuthenticationContext
中,我没有看到任何方法利用此证书来获取进行使用和评级API调用所需的访问令牌
我试图引用,但我没有看到任何可用于使用率和费率卡的客户机,答案是ManagementClient,它不适用于我的用例。我也提到了这个博客,它提到了ClientAssertionCertificate
,我在文章中没有看到
NB:我能够使用基于用户名、密码和客户端ID的身份验证机制对Azure进行REST API调用,以获取使用情况和费率卡信息,但是我想使用这个管理证书机制,因为我的应用程序的用户可能不信任这个应用程序及其凭据,而且从用户的角度来看,这个基于证书的机制似乎更容易使用。简单的答案是,您不能使用管理证书来使用计费API。计费API本质上是使用Azure AD令牌的较新API的一部分 管理证书只能用于 但是,在AuthenticationContext中,我没有看到任何方法利用此证书来获取进行使用率和速率API调用所需的访问令牌 我也提到了这个博客,其中提到了ClientAssertionCertificate,我在adal的java库中没有看到它 正如Gaurav所说,我们只能使用Azure Active Directory调用使用率和费率卡API进行身份验证。您可以使用AuthenticationContext获取
访问\u令牌
,如下代码所示。您需要提供客户ID
和客户机密
(密钥
)
私有身份验证结果getAccessTokenFromClientCredentials()
扔掉的{
AuthenticationContext上下文=null;
AuthenticationResult=null;
ExecutorService=null;
试一试{
服务=Executors.newFixedThreadPool(1);
context=newauthenticationcontext(authority+tenant+“/”,true,
服务);
未来)。我建议您参考本文档了解如何。这是否意味着除了获取用户的用户名和密码之外,没有其他方法可以从使用率和费率卡API获取数据?这是正确的。IMHO,这是正确的方法。使用管理证书方法,本质上拥有证书的人完全控制您的Azure订阅。通过此方法,您可以获得基于角色的访问控制,以便您可以向Azure订阅上的用户授予细粒度权限。
private AuthenticationResult getAccessTokenFromClientCredentials()
throws Throwable {
AuthenticationContext context = null;
AuthenticationResult result = null;
ExecutorService service = null;
try {
service = Executors.newFixedThreadPool(1);
context = new AuthenticationContext(authority + tenant + "/", true,
service);
Future<AuthenticationResult> future = context.acquireToken(
"https://graph.windows.net", new ClientCredential(clientId,
clientSecret), null);
result = future.get();
} catch (ExecutionException e) {
throw e.getCause();
} finally {
service.shutdown();
}
if (result == null) {
throw new ServiceUnavailableException(
"authentication result was null");
}
return result;
}