Flex 3 - как поддерживать Аутентификацию HTTP URLRequest?

Вы можете использовать itertools.groupby с str.isdigit в качестве ключевой функции:

from itertools import groupby
[''.join(g) for _, g in groupby(n, key=str.isdigit)]

Это возвращает:

['1', '+', '22', '-', '3', '*', '4', '/', '5']
10
задан BrynJ 21 May 2009 в 09:22
поделиться

8 ответов

Синтаксис немного отличается для URLRequest, но идеи то же:

private function doWork():void
{
    var req:URLRequest = new URLRequest("http://yoursite.com/yourservice.ext");
    req.method = URLRequestMethod.POST;
    req.data = new URLVariables("name=John+Doe");

    var encoder:Base64Encoder = new Base64Encoder();        
    encoder.encode("yourusername:yourpassword");

    var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());
    req.requestHeaders.push(credsHeader);

    var loader:URLLoader = new URLLoader();
    loader.load(req);
}

Несколько вещей иметь в виду:

  • Лучше всего я могу сказать, по некоторым причинам, это только работает, где методом запроса является POST; заголовки не становятся установленными с, ПОЛУЧАЮТ запросы.

  • Интересно, это также перестало работать, если по крайней мере одна пара "имя-значение" URLVariables не упаковывается с запросом, как обозначено выше. Вот почему многие примеры, которые Вы видите там (включая мой) присоединяют "name=John+Doe" - это - просто заполнитель для некоторых данных, которых URLRequest, кажется, требует при установке любых пользовательских HTTP-заголовков. Без него также перестанет работать даже правильно аутентифицируемый запрос POST.

  • По-видимому, версия 9.0.115.0 Flash player полностью блокируют все заголовки Авторизации (больше информации об этом здесь), таким образом, Вы, вероятно, захотите иметь это в виду, также.

  • Необходимо будет почти наверняка изменить файл crossdomain.xml для размещения заголовка (заголовков), Вы собираетесь быть отправкой. В моем случае я использую это, которое является довольно широко открытым файлом политики, в котором он принимает от любого домена, таким образом, в Вашем случае, Вы могли бы хотеть ограничить вещи немного больше, в зависимости от того, насколько сознательный безопасность Вы.

crossdomain.xml:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" />
    <allow-http-request-headers-from domain="*" headers="Authorization" />
</cross-domain-policy> 

... и это, кажется, работает; больше информации об этом доступно от Adobe здесь).

Код выше был протестирован с Flash player 10 (с отладкой и выпуском SWFs), таким образом, это должно работать на Вас, но я хотел обновить свое исходное сообщение для включения всей этой дополнительной информации в случае, если Вы сталкиваетесь с любыми проблемами, поскольку возможности кажутся (печально) вероятными, что Вы будете.

Надежда это помогает!Удачи. Я буду внимательно наблюдать за комментариями.

19
ответ дан 3 December 2019 в 16:11
поделиться

Я не уверен в этом , но вы пробовали добавлять имя пользователя: пароль @ ? в начале вашего URL

" HTTP: // имя пользователя: password@yoursite.com / yourservice. доб. "

1
ответ дан 3 December 2019 в 16:11
поделиться

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

Проблема заключалась в том, что FireFox использует отдельный экземпляр окна браузера для отправки запроса на загрузку файла. Решение состоит в том, чтобы вручную прикрепить идентификатор сеанса к URL-адресу запроса. Идентификатор сеанса прикрепляется не как обычная переменная GET, а через точку с запятой (причина такого синтаксиса мне неизвестна).

0
ответ дан 3 December 2019 в 16:11
поделиться

Flash очень ограничен с точки зрения того, какие заголовки вы можете передавать с HTTP-запросом (и он меняется между браузерами и ОС). Если вы заставили это работать в одном браузере / ОС, обязательно протестируйте его в других.

Лучше всего не связываться с заголовками HTTP.

У нас та же проблема (загрузка в Веб-альбомы Picasa из флеш-памяти) и разместите через прокси на нашем сервере. Мы передаем лишние заголовки как параметры сообщения, и наш прокси-сервер делает все правильно.

0
ответ дан 3 December 2019 в 16:11
поделиться
var service : HTTPService  = new HTTPService ();
var encoder:Base64Encoder = new Base64Encoder();
encoder.insertNewLines = false;
encoder.encode("user:password");

service.headers = {Authorization:"Basic " + encoder.toString()};
service.method = HTTPRequestMessage.POST_METHOD;
service.request = new URLVariables("name=John+Doe");
service.addEventListener(FaultEvent.FAULT,error_handler );
service.addEventListener(ResultEvent.RESULT,result_handler);
service.url = 'http://blah.blah.xml?'+UIDUtil.createUID();
service.send();
1
ответ дан 3 December 2019 в 16:11
поделиться

Методы FileReference.upload () и FileReference.download () не поддерживают параметр URLRequest.requestHeaders. .

http://livedocs.adobe.com/flex/2/langref/flash/net/URLRequest.html

3
ответ дан 3 December 2019 в 16:11
поделиться

"http://username:password@yoursite.com/yourservice.ext"

Это не работает в IE (http://www.theregister.co.uk/2004/01/30/ms_drop_authentication_technique/) и, похоже, не работает в Chrome.

, вероятно, не может быть у использования во Flash

0
ответ дан 3 December 2019 в 16:11
поделиться

Вот обходной путь при использовании ASP.Net, частично основанный на работе здесь .

Я создал компонент, который динамически записывает объекты Flex на страницу, чтобы их можно было использовать в UpdatePanels. Напишите мне, если хотите, чтобы они кодировали. Чтобы решить указанную выше проблему на страницах, где файлы cookie проверки подлинности должны быть отправлены с помощью URLRequest, я добавляю значения в виде flashVars.

Этот код работает только в моем объекте, но вы поняли идею

Dictionary<string, string> flashVars = new Dictionary<string, string>();     
flashVars.Add("auth", Request.Cookies["LOOKINGGLASSFORMSAUTH"].Value);
flashVars.Add("sess", Request.Cookies["ASP.NET_SessionId"].Value);
myFlexObject.SetFlashVars(flashVars);

Затем в объекте Flex проверьте параметры

if (Application.application.parameters.sess != null)
    sendVars.sess= Application.application.parameters.sess;
if (Application.application.parameters.auth != null)
    sendVars.au= Application.application.parameters.auth;

request.data = sendVars;
request.url = url;
request.method = URLRequestMethod.POST;

Наконец, добавьте файлы cookie в global.asax BeginRequest

if (Request.RequestType=="POST" && Request.Path.EndsWith("upload.aspx"))
{
    try
    {
        string session_param_name = "sess";
        string session_cookie_name = "ASP.NET_SESSIONID";
        string session_value = Request.Form[session_param_name]; // ?? Request.QueryString[session_param_name];
        if (session_value != null) { UpdateCookie(session_cookie_name, session_value); }
    }
    catch (Exception) { }

    try
    {
        string auth_param_name = "au";
        string auth_cookie_name = FormsAuthentication.FormsCookieName;
        string auth_value = Request.Form[auth_param_name];// ?? Request.QueryString[auth_param_name];

        if (auth_value != null) { UpdateCookie(auth_cookie_name, auth_value); }
    }
    catch (Exception) { }   

}

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

0
ответ дан 3 December 2019 в 16:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: