Как подключиться к хранилищу BLOB-объектов Azure с помощью субъекта-службы с Java / Spring-Boot

Я пишу приложение с использованием Spring Boot и Java, которое будет записывать файлы в хранилище BLOB-объектов Azure. Как я могу использовать субъекта-службы для аутентификации? В идеале сведения о SP должны быть прочитаны через некоторые свойства или внешний файл.

Я пробирался сквозь груду документации и примеров, но все они, похоже, не совсем то, что я ищу. В большинстве примеров, которые я видел, используется ключ учетной записи хранения, чего я не хочу делать.

Некоторые примеры кода были бы очень признательны. Как я уже сказал, я изо всех сил пытаюсь найти достойный пример (как использования SP, так и в целом, как писать в хранилище BLOB-объектов Azure на Java), поскольку, похоже, существует так много разных способов доступа к хранилищу, разбросанным по всему миру. microsoft docs.


person user11890829    schedule 06.08.2019    source источник
comment
почему вы хотите использовать принципала вместо ключа учетной записи?   -  person Starbax    schedule 07.08.2019
comment
Мне не нравится идея предоставить моему приложению неограниченный доступ к учетной записи хранения, предоставив ей ключ, использование субъекта-службы дает мне более ограниченные разрешения   -  person user11890829    schedule 07.08.2019


Ответы (2)


Вы можете использовать ADAL4J для получения токена, а затем использовать токен для записи в капли.

  1. Добавьте назначение роли своему принципалу.

введите здесь описание изображения

  1. Получите токен.

    public static String getToken() throws Exception {
        String TENANT_ID = "your tenant id or name, e4c9*-*-*-*-*57fb";
        String AUTHORITY = "https://login.microsoftonline.com/" + TENANT_ID;
        String CLIENT_ID = "your application id, dc17*-*-*-*a5e7";
        String CLIENT_SECRET = "the secret, /pG*32";
        String RESOURCE = "https://storage.azure.com/";
        String ACCESS_TOKEN = null;
        ExecutorService service = Executors.newFixedThreadPool(1);
        AuthenticationContext context = null;
        try {
            context = new AuthenticationContext(AUTHORITY, false, service);
            ClientCredential credential = new ClientCredential(CLIENT_ID, CLIENT_SECRET);
            Future<AuthenticationResult> future = context.acquireToken(RESOURCE, credential, null);
            ACCESS_TOKEN = future.get().getAccessToken();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } finally {
            service.shutdown();
        }
        return ACCESS_TOKEN;
    }
    
  2. Доступ к BLOB-объекту.

    public static void main(String[] args) throws Exception {
        String token = getToken();
        StorageCredentialsToken credentialsToken = new StorageCredentialsToken("storagetest789", token);
        CloudBlobClient blobClient = new CloudBlobClient(new URI("https://storagetest789.blob.core.windows.net/"), credentialsToken);
        CloudBlobContainer blobContainer = blobClient.getContainerReference("pub");
        CloudBlockBlob blockBlob = blobContainer.getBlockBlobReference("test.txt");
        blockBlob.uploadText("Test!");
    }
    

Надеюсь, это поможет.

person Jack Jia    schedule 07.08.2019
comment
Привет, Джек, я попробовал тот же код и получил следующую ошибку: Исключение в основном потоке com.microsoft.azure.storage.StorageException: HTTP-заголовок, обязательный для этого запроса, не указан. Есть мысли по этому поводу? - person Gandhi; 23.03.2020
comment
Эй, какую версию вы используете? Я не могу найти указанные выше классы в compile group: 'com.azure', name: 'azure-storage-blob', version: '12.6.0' Можете ли вы предоставить образец кода для V12. - person Nitin; 10.04.2020

Другой способ получить токен доступа - с использованием библиотеки аутентификации MS

Эта библиотека использовала «строителей» для построения конфиденциального клиента. Если вы используете этот класс, он обрабатывает для вас обновление токена и обрабатывает кеш.

person Helay    schedule 26.09.2019
comment
Качество вашего ответа резко улучшилось бы, если бы вы могли собрать небольшой пример, чтобы показать, как эта библиотека решает проблему OP :) - person geisterfurz007; 01.10.2019