2015-10-01 4 views
0

Microsoft заявляет, что получение Blob - это просто обычный http get https://myaccount.blob.core.windows.net/mycontainer/myblob. Но как мне форматировать строку, когда у меня есть аккаунт + общий ключ?Формат частного URL-адреса памяти для файла GET. Rest API

Я знаю, что есть Azure SDK, но я создаю «дополнение» к существующей системе java ee и не могу работать в Azure, поэтому я использую REST Api. Это то, что я пытался до сих пор:

String account = "myaccount"; 
    String key = "243fedfsdf23f4f"; 
    String protocol = "http"; 
    String storageConnectionString = String.format("DefaultEndpointsProtocol=%s;AccountName=%s;AccountKey=%s", protocol, account, key); 
    System.out.println(storageConnectionString);   

    URL url = new URL("https://mysite.azureweb.com/myfile.txt"); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

    if (conn.getResponseCode() != 200) { 
     throw new IOException(conn.getResponseMessage()); 
    } 

    // Buffer the result into a string 
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    while ((line = rd.readLine()) != null) { 
     sb.append(line); 
    } 
    rd.close(); 
    conn.disconnect(); 

Строка, вероятно, нуждается в некотором Base64 кодирование?

Update

Запрос Http выглядит GET https://myAccount.blob.core.windows.net/myDir/myfile.txt HTTP/1.1 x-ms-date: Thu, 01 Oct 2015 12:56:11 GMT x-ms-version: 2015-02-21 Authorization: SharedKey myAccount:asdfkjsladjfsdf827fhwf298f924f92723dfh23f273f2h7h4f Host: myAccount.blob.core.windows.net

Я "просто" нужно упаковать это в запросе, чтобы получить файл в /mydir/myfile.txt

+0

Возможно, вы захотите удалить тот ключ, который вы положили в вопрос, и изменить/удалить значение ключа на сервере azure. –

+0

Частное хранилище памяти, поэтому мне нужен ключ. Это был всего лишь пример, ключ намного длиннее. –

+0

Хорошо, я не знал, просто думал, что это ключ, поэтому подумал о том, чтобы предупредить вас. –

ответ

2

Там два типа доступа для хранения лазурного дерева. Один через Общие ключи и другие другие через Подписи общего доступа.

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

Вы только хотите дать кому-то доступ к одному файлу. Поэтому использование общих ключей было бы неправильным решением.

Подписи общего доступа дает вам возможность создать запрос (REST), который ограничен определенными файлами или контейнерами. Вы можете выбирать привилегии, такие как запись, чтение, удаление и т. Д. И вы определяете временные рамки, в которых доступ действителен. Для подписей общего доступа у вас есть два варианта: a) ad-hoc и b) основанные на политике. Специальные подписки с общим доступом не могут быть легко отменены (вы можете удалить файл или аннулировать общий ключ, который использовался для создания подписи общего доступа). Политические подписи общего доступа можно легко отменить, удалив политику.

Если вы не хотите использовать Azure SDK, вы можете создать свои собственные подписи общего доступа. Как построить их объясняется в следующей ссылке:

Constructing a Service SAS

Есть также образцы.

Service SAS Examples

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

signedstart=2013-08-16 
signedexpiry=2013-08-17 
signedresource=c 
signedpermissions=r 
signature=dD80ihBh5jfNpymO5Hg1IdiJIEvHcJpCMiCMnN/RnbI= 
signedidentifier=YWJjZGVmZw== 
signedversion=2013-08-15 
responsecontent-disposition=file; attachment 
responsecontent-type=binary 


StringToSign = r + \n 
       2013-08-16 + \n 
       2013-08-17 + \n 
       /myaccount/pictures + \n 
       YWJjZGVmZw== + \n 
       2013-08-15 + \n 
       + \n 
       file; attachment + \n 
       + \n 
       + \n 
       binary 


HMAC-SHA256(URL.Decode(UTF8.Encode(StringToSign))) = a39+YozJhGp6miujGymjRpN8tsrQfLo9Z3i8IRyIpnQ= 

Наконец-то вы получаете URL-адрес своего запроса REST.

GET https://myaccount.blob.core.windows.net/pictures/profile.jpg?sv=2013-08-15&st=2013-08-16&se=2013-08-17&sr=c&sp=r&rscd=file;%20attachment&rsct=binary &sig=YWJjZGVmZw%3d%3d&sig=a39%2BYozJhGp6miujGymjRpN8tsrQfLo9Z3i8IRyIpnQ%3d HTTP/1.1 

Посмотрите на две страницы для полного объяснения.

+0

Nice one! Да, у меня есть один общий ключ, который дает мне доступ ко всему блоку памяти. Итак, StringToSign + общий ключ, декодированный с помощью base64, дает мне подпись общего доступа? –

+0

Конечный токен (параметр 'sig') кодируется base64. Вы можете использовать StringToSign с вашим общим ключом. Функции хэша работают с двоичными данными, поэтому вам нужно кодировать StringToSign с помощью UTF8 (перед хэшированием). После хэширования вы кодируете двоичные данные с base64 ->, что является значением параметра sig. –

0

Существует простой способ создания SAS для получения файлов в частном контейнере с использованием SDK Azure Storage.

После пример кода ниже Generat ключ SAS и формат URL:

String accountName = "<your_account_name>"; 
String accountKey = "<your_account_key>"; 
String containerName = "<your_private_container_name>"; 
String blobFileName = "<your_blob_file_name>"; 
String storageConnectionString = String.format("DefaultEndpointsProtocol=%s;AccountName=%s;AccountKey=%s", "https", accountName, accountKey); 
CloudStorageAccount account = CloudStorageAccount.parse(storageConnectionString); 
CloudBlobClient blobClient = account.createCloudBlobClient(); 
CloudBlobContainer container = blobClient.getContainerReference(containerName); 
CloudBlockBlob blob = container.getBlockBlobReference(blobFileName); 
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy(); 
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC")); 
calendar.setTime(new Date()); 
policy.setSharedAccessStartTime(calendar.getTime()); 
calendar.add(Calendar.HOUR, 1); 
policy.setSharedAccessExpiryTime(calendar.getTime()); 
policy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ)); 
String sas = blob.generateSharedAccessSignature(policy, null); 
System.out.println(sas) 
String urlstr = String.format("https://%s.blob.core.windows.net/%s/%s?%s", accountName, containerName, blobFileName, sas); 
System.out.println(urlstr); 

Для получения дополнительной информации Вы можете обратиться к документу https://msdn.microsoft.com/en-us/library/hh875756.aspx.

 Смежные вопросы

  • Нет связанных вопросов^_^