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 кодирует полученную строку.
Каждый раз, когда я отправляю запрос, я получаю следующий ответ:
401
MalformedToken: недействительный заголовок авторизации: в запросе отсутствуют учетные данные авторизации WRAP. Идентификатор отслеживания:8d52cae0-0dba-470d-8db2-3e76d4fd4d0b_G27, отметка времени: 25.09.2015 9:45:17
Может кто-нибудь сказать, что мне не хватает или я что-то не так делаю?
1 ответ
К запросу должен быть прикреплен токен доступа в заголовках запроса. При использовании служебной шины 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() + "\"");