All
Извините - это, наверное, очень странный вопрос.
Я работаю над Flash RIA. Одна из вещей, которую он делает, это вызывает страницу ASP (которая находится в другом домене), чтобы получить некоторые данные.
Однако эта страница ASP требует, чтобы пользователи выполнили вход на этот сайт, прежде чем им будет разрешено вызывать эту страницу ASP.
Итак, моей первой попыткой заставить это работать в приложении Flash было использование loadVars.sendAndLoad () для публикации переменных входа в систему на странице входа. Это устанавливает куки / переменные сессии, чтобы установить мой статус "вошел в систему". Затем, когда приложение Flash вызывает страницу ASP для запроса необходимых данных, все работает. Другими словами, вызов loadVars.sendAndLoad на первую страницу регистрирует меня, и этот статус входа поддерживается (как-то), так что когда приложение Flash вызывает страницу ASP позже, страница ASP считает, что я все еще вошел в систему. в.
Отличное решение, за исключением того, что теперь приложение Flash будет развернуто в другом домене. Другими словами, страница ASP (и страница входа в систему) находятся на domainA.com, а приложение Flash будет на domainB.com. А приложения Flash не могут вызывать URL-адреса в разных доменах (я знаю о файлах политики междоменных доменов, но по разным причинам это не вариант).
Итак, моей следующей мыслью было следующее - настроить страницу PHP на domainB.com, которая использует cURL для передачи переменных входа в систему на странице входа. Настройте еще одну страницу PHP на domainB.com, которая использует cURL для вызова страницы ASP.
Затем я могу настроить приложение Flash так, чтобы оно вызывало те страницы PHP, которые будут действовать как «прокси».
Однако это не работает. Когда я вызываю первую страницу PHP (которая передает переменные на страницу входа на domainA.com), я думаю, что это работает. Однако, если я затем вызываю вторую страницу PHP, страница ASP на domainA.com отклоняет запрос, как будто я не вошел в систему.
Другими словами, когда я запускаю все из Flash - кажется, что статус «залогинен» сохраняется от первого запроса до последующих запросов. Однако, когда я запускаю все со страниц PHP, состояние входа в систему не поддерживается.
Первая страница PHP, кажется, входит в систему. Но вторая страница PHP не засчитывается за вход в систему.
Есть ли какая-нибудь идея, как файлы cookie обрабатываются по-разному во Flash и PHP, что объясняет эту разницу?
Я с удовольствием предоставлю гораздо более подробную информацию, основываясь на любых советах или указаниях.
Заранее большое спасибо!
---- РЕДАКТИРОВАТЬ ----
Основываясь на потрясающих отзывах и предложениях, я заставил это работать. У меня не было шанса отполировать его; может случиться так, что некоторые опции cURL не нужны или избыточны. Но, по крайней мере, это работает. Вот код:
<?php
$ckfile = tempnam (".", "CURLCOOKIE");
$url_1 = 'https://somedomain.com/loginService';
$url_2 = 'https://somedomain.com/getMyData.asp';
$fields_1 = array(
'field1'=>"blah",
'field2'=>"blah",
'field3'=>"blah",
);
$fields_2 = array(
'fieldX'=>"blah",
'fieldY'=>"blah",
'fieldZ'=>"blah",
);
$a='';
$postvars_1 = '';
foreach($fields_1 as $key=>$value) {
$postvars_1.= $a.urlencode($key).'='.urlencode($value);
$a='&';
}
$a='';
$postvars_2 = '';
foreach($fields_2 as $key=>$value) {
$postvars_2.= $a.urlencode($key).'='.urlencode($value);
$a='&';
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($ch, CURLOPT_URL, $url_1);
curl_setopt($ch, CURLOPT_POST, count($fields_1));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars_1);
$result_1 = curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, $url_2);
curl_setopt($ch, CURLOPT_POST, count($fields_2));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars_2);
$result_2 = curl_exec($ch);
curl_close($ch);
header("Content-type: text/xml");
print $result_2;
unlink($ckfile);
?>
Само собой разумеется, могут быть намного лучшие способы сделать это, или некоторые серьезные проблемы с моим кодом. Но работать сейчас лучше, чем ничего. Я бы никогда не сделал так, чтобы это работало без помощи сообщества и людей ниже. Большое, большое спасибо!