0

J'utilise adal4j v1.1.2 pour obtenir un jeton basé sur un certificat client.adal4j: erreur d'authentification basée sur un certificat: jeton JWT non valide

Snippet fait référence: 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(); 

Il en résulte exception suivante auth

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"} 

Je ne sais pas comment passer thumbprint tout en appelant acquireToken. Quelque chose manque-t-il ici?

+0

Pouvez-vous nous montrer comment vous construisez 'asymmetricKeyCredential'? –

+0

mis à jour l'article original avec l'extrait complet – YogeshORai

+0

Quelqu'un peut suggérer ce qui manque ici – YogeshORai

Répondre

0

Selon votre code, il semble que vous souhaitiez vous authentifier avec l'API Azure Service Management à l'aide d'un certificat, mais le code d'obtention du jeton d'accès semble s'authentifier à l'aide d'Azure AD. Vous pouvez vous référer à l'article Authenticating Service Management Requests pour connaître leurs différences.

À titre de référence, il y a un blog qui présente comment consommer l'API Windows Azure Service Management avec certificat en Java.

Cependant, selon mon expérience, selon le code String AAD_RESOURCE_ID = "https://vault.azure.net";, il semble également que vous souhaitiez effectuer certaines opérations de gestion pour Azure Key Vault. Avec la référence d'API REST pour Azure Key Vault Management, vous devez obtenir le jeton d'accès avec Azure Resource Manager pour effectuer ces opérations. Donc, si vous voulez gérer Key Vault, s'il vous plaît se référer à l'autre blog pour savoir comment s'authentifier avec ARM en Java.

Espérons que ça aide.


Mise à jour:

Le AAD_RESOURCE_ID pour Key Vault devrait être comme /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.KeyVault/vaults/{vault-name}, s'il vous plaît se référer à l'article https://msdn.microsoft.com/en-us/library/azure/mt620025.aspx et rechercher le mot-clé resource id et voir comme la figure ci-dessous. enter image description here

Et vous pouvez obtenir l'ID de ressource via la commande Azure CLI azure keyvault show --vault-name <your-keyvault-name>.