繁体   English   中英

adal4j:基于证书的身份验证错误:无效的JWT令牌

[英]adal4j : certificate based authentication error : invalid JWT token

我正在使用adal4j v1.1.2获取基于客户端证书的令牌。

参考代码段: 为什么带有ClientCredential的AcquireToken会因invalid_client(ACS50012)而失败?

String AAD_HOST_NAME = "login.windows.net";
String AAD_TENANT_ID = "XXX";
String AAD_TENANT_ENDPOINT = "https://" + AAD_HOST_NAME + "/" + AAD_TENANT_ID + "/";
String AAD_CLIENT_ID = "XXX";
String AAD_RESOURCE_ID = "https://vault.azure.net";
String AAD_CERTIFICATE_PATH = "/XXX.pfx";
String AAD_CERTIFICATE_PASSWORD = "XXX";
String AAD_CLIENT_SECRET = "XXX";

ExecutorService service = ExecutorServiceHelper.createThreadPool(1, "azureHSMClientExecutorService-");

KeyStore keystore = KeyStore.getInstance("PKCS12", "SunJSSE");
keystore.load(new FileInputStream(AAD_CERTIFICATE_PATH),AAD_CERTIFICATE_PASSWORD.toCharArray());
String alias = keystore.aliases().nextElement();
PrivateKey key = (PrivateKey) keystore.getKey(alias, AAD_CERTIFICATE_PASSWORD.toCharArray());
X509Certificate cert = (X509Certificate) keystore.getCertificate(alias);
AsymmetricKeyCredential asymmetricKeyCredential = AsymmetricKeyCredential.create(AAD_CLIENT_ID,key, cert);
AuthenticationContext ctx = new AuthenticationContext(AAD_TENANT_ENDPOINT, false, service);
Future<AuthenticationResult> result = ctx.acquireToken(AAD_RESOURCE_ID, asymmetricKeyCredential, null);
AuthenticationResult authenticationResult = result.get();
String token = authenticationResult.getAccessToken();

这导致以下身份验证异常

AuthenticationException: com.microsoft.aad.adal4j.AuthenticationException: {"error":"invalid_client","error_description":"AADSTS70002: Error validating credentials. AADSTS50027: Invalid JWT token. No certificate thumbprint specified in token header.\r\nTrace ID: 9719e621-d8ef-4194-93cd-a78103d5df6b\r\nCorrelation ID: f0300795-fb99-44b2-bd95-8df3975290be\r\nTimestamp: 2016-08-29 13:51:26Z"}

我不确定如何在调用acquireToken传递指纹。 这里缺少什么吗?

根据您的代码,您似乎想要使用证书使用Azure Service Management API进行身份验证,但是用于获取访问令牌的代码似乎使用Azure AD进行了身份验证。 您可以参考文章认证服务管理请求以了解它们之间的差异。

作为参考,有一个博客介绍如何使用Java证书使用Windows Azure服务管理API。

但是,根据我的经验,根据代码String AAD_RESOURCE_ID = "https://vault.azure.net"; ,您似乎还想对Azure Key Vault进行一些管理操作。 有了用于Azure Key Vault Management的REST API参考,您应该使用Azure Resource Manager获取访问令牌以执行这些操作。 因此,如果要管理Key Vault,请参考其他博客,以了解如何在Java中使用ARM进行身份验证。

希望能帮助到你。


更新:

Key Vault的AAD_RESOURCE_ID应该类似于/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.KeyVault/vaults/{vault-name} ,请参阅文章https:// msdn.microsoft.com/zh-cn/library/azure/mt620025.aspx,然后搜索关键字resource id ,如下图所示。 在此处输入图片说明

您可以通过Azure CLI命令azure keyvault show --vault-name <your-keyvault-name>获取资源ID。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM