2016-08-29 30 views
0

私はadal4j v1.1.2を使用してクライアント証明書に基づいてトークンを取得しています。adal4j:証明書ベースの認証エラー:無効なJWTトークン

スニペットは呼ば:Why does AcquireToken with ClientCredential fail with 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の呼び出し中に拇印を渡すするかどうかはわかりません結果。ここに何かが欠けていますか?

+0

'asymmetricKeyCredential'の構築方法を教えてください。 –

+0

完全なスニペットで元のポストを更新 – YogeshORai

+0

誰かがここに欠けているものを提案できます – YogeshORai

答えて

0

あなたのコードによると、Azureサービス管理APIで証明書を使用して認証したいと思われますが、アクセストークンを取得するコードはAzure ADを使用して認証されているようです。その違いを知るには、Authenticating Service Management Requestsの資料を参照してください。

参考資料として、Windows Azure Service Management APIをJavaで証明書を使用する方法を紹介するblogがあります。

しかし私の経験によれば、コードString AAD_RESOURCE_ID = "https://vault.azure.net";によれば、Azure Key Vaultの管理操作をしたいと思うようです。 Azure Key Vault ManagementのREST APIリファレンスを使用して、これらの操作を行うAzure Resource Managerでアクセストークンを取得する必要があります。したがって、Key Vaultを管理する場合は、blogを参照して、JavaでARMで認証を行う方法を理解してください。

希望します。


更新:キーVaultのAAD_RESOURCE_ID/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.KeyVault/vaults/{vault-name}ようにする必要があり

、記事https://msdn.microsoft.com/en-us/library/azure/mt620025.aspxを参照し、キーワードresource idを検索し、下図のように参照してください。 enter image description here

そして、Azure CLIコマンドazure keyvault show --vault-name <your-keyvault-name>でリソースIDを取得できます。

関連する問題