Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Авторизация через PHPSESSID для Flash.

00 голосов
4
Вопрос как бы сделать авторизацию с первого раза через PHPSESSID?
Нужно авторизовать содержимое Flash на AS3,  кнопку на сайте, кнопка это загрузчик файлов.
Получается авторизоваться только со второго раза, так как  Flash  имеет свои cookie, которыми я могу управлять только через PHP и они устанавливаются после первого прогона 
setcookie("PHPSESSID", $_POST["PHPSESSID"], time() + 3600, "/";)
/bitrix/modules/main/include/prolog_before.php 
а после второго начинает работать 
$USER->IsAuthorized()
То есть строка в скрипте верно устанавливает cookie, но что бы воспользоваться плодами авторизации нужно обратиться к скрипту второй раз.

Как это выглядит
AS3
Код
_postParams.connect_type = "flash"; 
_postParams.PHPSESSID = getCookie("PHPSESSID"); 
_postParams.BITRIX_SM_GUEST_ID = getCookie("BITRIX_SM_GUEST_ID"); 
_postParams.BITRIX_SM_LAST_VISIT = getCookie("BITRIX_SM_LAST_VISIT"); 
_postParams.BITRIX_SM_SOUND_LOGIN_PLAYED = getCookie("BITRIX_SM_SOUND_LOGIN_PLAYED"); 
_postParams.BITRIX_SM_LOGIN = getCookie("BITRIX_SM_LOGIN"); 
_postParams.BITRIX_SM_SALE_UID = getCookie("BITRIX_SM_SALE_UID"); 
_postParams.action = "upload"; 
_postParams.confirm = "true"; 
trace("_postParams.PHPSESSID: "+_postParams.PHPSESSID);

_urlRequest.method = URLRequestMethod.POST; 
_urlRequest.data = _postParams; 
         
         

_fileReference.upload(_urlRequest, "userfile[]");



Код
private function getCookie(returnStr:Stri ng):S tring

самописная функция забирает куки через javascript

Код
ExternalInterface.call("f unction(){return document.cookie}";


и парсит их в обьект а затем отдает по ключу .
На стороне сервера сделано так PHP
Код
if ($_POST["connect_type"] == "flash") {  
    setcookie("PHPSESSID", $_POST["PHPSESSID"], time() + 3600, "/"); 
} 
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");  
собственно все, такая схема авторизации срабатывает только со второго раза.
Это все происходит по тому, что после подключения  require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php";);
происходит сброс PHPSESSID на предыдущую, то есть не в ноль, не в рандом, а на предыдущую, но со второго раза пролог уже читает нормальную cookie которая была установлена в прошлый запуск.
спросил 02 Дек, 13 от GIN1 (200 баллов)

4 Ответы

00 голосов
Я так понял идея похоже не однозначная, если учесть то, что даже битрикс использует сторонний загрузчик на Flash от  http://www.aurigma.com/ а не свой.
Посмотрел исходный код этого aurigma и чего то не нашел как он так хитро обходит авторизацию битрикс, 
все что удалось найти по сетевым функциям это
Код
         private function initContextMenu():void{
            var auItem:* = new contextmenuitem(_-0S._-9Z);
            auItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, f unction (_arg1:ContextMenuEvent):void{
                navigateToURL(new URLRequest(_-0S._-V));
            });
            var m:* = new contextmenu();
            m.hidebuiltinitems();
            m.customitems.push(auItem);
            this.contextmenu = m;
        }
похоже на пере направление в галерею после загрузки.
ответил 01 Фев, 14 от GIN1 (200 баллов)
00 голосов
Я во флеше профан, но разве нельзя передавать в параметры флеша id сессии, а не через куки, ну а потом её отдавать обратно битриксу?
ответил 20 Май, 14 от Apostolq (340 баллов)
00 голосов
Цитата
Михаил Сидоров пишет:
Я во флеше профан, но разве нельзя передавать в параметры флеша id сессии, а не через куки, ну а потом её отдавать обратно битриксу?
Я ее передаю как раз,
$_POST["PHPSESSID"]
а потом устанавливаю куку как в примере выше, но битрикс видит ее только со второго раза, а если отправлять файл через пост, то его нужно закодировать Base64, но тогда он сильно будет увеличен в размере.
ответил 17 Сен, 14 от GIN1 (200 баллов)
00 голосов
Покопался в исходниках, есть такая функция /home/bitrix/sites1/shared/bitrix/modules/main/tools.php

Код
function bitrix_sessid_set($val=false)

{

     if($val === false)

          $val = md5(session_id());

     $_SESSION["fixed_session_id"] = $val;

} 
но так сделать не получается

Код
    session_id($_POST["PHPSESSID"]);
    session_start();
    bitrix_sessid_set(false); 
кроме того после этого меня выкидывает из авторизации уже в браузере, хотя в Firefix вроде бы Flash имеет свои куки не как в IE.
ответил 21 Янв, 15 от GIN1 (200 баллов)

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

0 голосов
0 ответов
0 голосов
2 ответов
0 голосов
4 ответов
спросил 13 Дек, 13 от Skvodan (120 баллов)