Azure KeyVaultErrorException на getKey
Я использую AzureClient Java SDK. Я создаю клиент keyvault следующим образом:
ApplicationTokenCredentials applicationTokenCredentials=new
ApplicationTokenCredentials(APPLICATION_ID, "DOMAIN", CLIENT_SECRET,
AzureEnvironment.AZURE);
vc = new KeyVaultClient(applicationTokenCredentials);
И я пишу этот код, чтобы получить ключ из каталога Azure:
Future<KeyBundle> keyBundleFuture = vc.getKeyAsync(testKeyIdentifier, new ServiceCallback<KeyBundle>() {
public void failure(Throwable throwable) {
}
public void success(KeyBundle keyBundle) {
System.out.print(keyBundle.toString());
}
});
KeyBundle keyBundle = keyBundleFuture.get();
Но я получаю эту ошибку
Exception in thread "main" java.util.concurrent.ExecutionException: com.microsoft.azure.keyvault.models.KeyVaultErrorException: Status code 401.
Также обратите внимание, что я дал разрешения своему приложению на портале Azure для доступа к keyvault.
1 ответ
Решение
По коду статуса 401
вашей ошибки и ссылки REST API Authentication, requests, and responses
Key Vault, это было вызвано использованием неверных учетных данных с Azure Java SDK. Для доступа к Key Vault с помощью Azure SDK необходимо пройти проверку подлинности с KeyVaultCredentials
который должен быть реализован методом doAuthenticate
,
В качестве ссылки, вот мой пример кода ниже.
ServiceClientCredentials credentials = new KeyVaultCredentials() {
@Override
public String doAuthenticate(String authorization, String resource, String scope) {
AuthenticationResult res = null;
try {
res = GetAccessToken(authorization, resource, clientId, secret);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return res.getAccessToken();
}
private AuthenticationResult GetAccessToken(String authorization, String resource, String clientID, String clientKey)
throws InterruptedException, ExecutionException {
AuthenticationContext ctx = null;
ExecutorService service = Executors.newFixedThreadPool(1);
try {
ctx = new AuthenticationContext(authorization, false, service);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Future<AuthenticationResult> resp = ctx.acquireToken(resource, new ClientCredential(
clientID, clientKey), null);
AuthenticationResult res = resp.get();
return res;
}
};
KeyVaultClient client = new KeyVaultClient(credentials);
String keyIdentifier = "https://<your-keyvault>.vault.azure.net/keys/<your-key>/xxxxxxxxxxxxxxxxxxxxxx";
KeyBundle keyBundle = client.getKey(keyIdentifier);
Тогда это работает.