среда, 24 октября 2012 г.

Доступ к ресурсам защищенным Basic authentication (ActionScript, Basic Authorization)

Преамбула:
При разработке десктопного приложения на AIR столкнулся с проблемой доступа к ресурсам защищеным Basic access authentication или по-простому базовой авторизацией. Причем ресурсы расположены на разных серверах, условно site1.ru и site2.ru.
  • site1.ru – серверная часть приложения
  • site2.ru – хранилище статических ресурсов (картинки, флешки и прочая мультимедия)
При работе аналогичного приложения в среде flash-плагина браузера проблем нет, прошел авторизацию на каждом сервере один раз за сеанс работы браузера и шпарь себе дальше.

Проблема:
Для базовой авторизации необходимо в HTTP-запросе передавать заголовок Authorization с данными по логину и паролю.
Добавить нужный заголовок в URLRequest не представляется возможным из-за ограничений URLRequestHeader.
Нельзя, а хочется, воспользоватся такими средствами как загрузчик LoaderMax.

Решение:
Способ №1
Есть отличная библиотека as3httpclient с реализацией на сокетах аналога URLLoader-а и URLRequest-а которые позволяют добавить необходимые заголовки в HTTP-запрос.
var loader:SocketURLLoader = new SocketURLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);

var request:SocketHTTPRequest = new SocketHTTPRequest();
request.url = "http://site1.ru";
request.requestHeaders = [new URLRequestHeader("Authorization", "Basic dXNlcjpwYXNzd29yZA==")];
loader.load(request);
dXNlcjpwYXNzd29yZA== 
это сериализованная в base64 строка "user:password".
Этот способ хорош для выполнения запросов обращеных к серверу бизнес-логики приложения и не удобен для загрузки статических ресурсов (в частости изображений) которые придется грузить в бинарном виде, заталкивать их в экземпляр класса Loader или другой класс для использования загруженного ресурса.

Способ №2
Как оказалось все уже придумано самими адобами.
Надо по-внимательней смотреть в документацию!
Встречайте URLRequestDefaults.
Достаточно один раз указать данные для авторизации, скажем в конструкторе главного класса приложения:
URLRequestDefaults.setLoginCredentialsForHost("site1.ru", "user", "password");
URLRequestDefaults.setLoginCredentialsForHost("site2.ru", "user", "password");
URLRequestDefaults.authenticate = true;

Комментариев нет:

Отправить комментарий