Microsoft Azure CreateQueue с использованием Simple REST Client

Я пытаюсь создать очередь в облаке Azure. У меня есть учетная запись Azure, пространство имен и использование служебной шины. Из-за некоторых ограничений мне нужно сделать это с помощью запросов RAW GET/PUT, поэтому я использую Simple REST Client.

Это значения, указанные в полях клиента REST:


URL

https://mynamespace-ns.servicebus.windows.net/

метод

ПОЛОЖИЛ

Заголовки

PUT /testqueue? Timeout = 30 HTTP / 1.1

x-ms-date: пт, 25 сентября 2015 03:16:12 GMT

x-ms-версия: 2009-09-19

Авторизация: SharedKey mynamespace-ns:oucfev8CXZPMsli4t7iZJ+nlC0fUwasyPH5OdSqi9po=

Хост: mynamespace-ns.servicebus.windows.net

Длина контента: 0


Вот как я генерирую ключ авторизации:

HmacSha256, кодирующая строку "PUT\n\n\n\n0\n\n\n\n\n\n\n\nx-ms-date: пт, 25 сентября 2015 03:16:12 GMT\nx-ms-version:2009-09-19\n/mynamespace-ns"с секретным ключом - это SharedAccessKey, скопированный со страницы сведений о подключении на портале Azure. После этого Base64 кодирует полученную строку.

Каждый раз, когда я отправляю запрос, я получаю следующий ответ:

401MalformedToken: недействительный заголовок авторизации: в запросе отсутствуют учетные данные авторизации WRAP. Идентификатор отслеживания:8d52cae0-0dba-470d-8db2-3e76d4fd4d0b_G27, отметка времени: 25.09.2015 9:45:17

Может кто-нибудь сказать, что мне не хватает или я что-то не так делаю?

1 ответ

К запросу должен быть прикреплен токен доступа в заголовках запроса. При использовании служебной шины Azure вам необходимо получить токен от службы контроля доступа Azure. Нашел эту страницу...

Шаблоны токенов доступа Azure

Вам не нужно использовать SDK, чтобы сделать все это, как я делаю то же самое из программы для Android.

РЕДАКТИРОВАТЬ...

Вы должны будете приспособить это к тому языку, который вы используете.

Сначала получите токен...

URL acsUrl = new URL("https://yournamespace-sb.accesscontrol.windows.net/WRAPv0.9/");
URL realm = new URL("http://yournamespace.servicebus.windows.net");
httpConn = (HttpURLConnection) acsUrl.openConnection();
httpConn.setRequestMethod("POST");
httpConn.setUseCaches(false);
httpConn.setDoInput(true);
httpConn.setDoOutput(true);
httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

String body = "wrap_name=" + URLEncoder.encode(AdminConstants.ISSUER, "UTF-8") + 
"&wrap_password=" + URLEncoder.encode(AdminConstants.ISSUER_SECRET, "UTF-8") +
"&wrap_scope=" + URLEncoder.encode(realm,  "UTF-8");
byte[] postBytes = body.getBytes();
httpConn.setRequestProperty("Content-Length", Integer.toString(postBytes.length));
httpConn.setRequestProperty("Expect", "100-continue");
httpConn.setRequestProperty("Accept", "*/*");

/* Fire the request here */

String[] responseProperties = response.toString().split("&");
String[] tokenProperty = responseProperties[0].split("=");
String token = URLDecoder.decode(tokenProperty[1], "UTF-8");

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

Наконец, когда вы звоните, чтобы создать очередь, вам нужно будет включить токен в ваш пост-запрос, как это...

httpConn.setRequestProperty("Authorization", "WRAP access_token=\"" + getAcsToken() + "\"");
Другие вопросы по тегам