Прежде чем пытаться выполнить следующие шаги, убедитесь, что аутентификация вашего сервера основана на сеансовых куки.
Решение сработало для меня:
Вам необходимо добавить куки из первого представления во второй запрос. В этом случае сервер рассматривает ваш второй запрос как аутентифицированный. В ответе после входа на сайт ваш cookie будет иметь следующий набор значений, таких как cookie-name, cookie-value, Expiration Date, Path, Secure и HTTPOnly. Из строки cookie взрываются cookie-name и cookie-value
Пример Session Cookie после входа в систему:
"JSESSIONID=DQl3NKXXmy3yntp3NW2GMlcn8pLn9PR9rl0lnR6vbtfdVpyHWdnq!598502565; path=/"
"CK_LanguageID_252085=1; expires=Friday, 23-Mar-2012 05:31:03 GMT; path=/; secure"
"CK_TimeZone_252085=4; expires=Friday, 23-Mar-2012 05:31:03 GMT; path=/; secure"
Создать новую строку cookie для дальнейшего взаимодействия с сервером по следующей схеме:
"JSESSIONID=DQl3NKXXmy3yntp3NW2GMlcn8pLn9PR9rl0lnR6vbtfdVpyHWdnq!598502565; CK_LanguageID_252085=1; CK_TimeZone_252085=4"
Добавление удобного метода для создания строки cookie из массива zend_http_client "Set-cookie".
/**
* Get clean cookie string with only name,value pair
* This method filer all the follwoing cookie information
* Expiration Date, Path, Secure and HTTPOnly
* @access public
* @param {Array} $cookies
* @return {String} $cookieString
*/
public function getCookieString(array $cookies){
$cookieString = null;
foreach($cookies as $cookie){
$part = explode(';',$cookie);
$cookieString = ($cookieString == null)? $part[0] : $cookieString . '; ' . $part[0];
}
return $cookieString;
}
Использование Zend_Http_Client для выполнения последовательных запросов:
//Login
$client = new Zend_Http_Client($loginUrl);
$response = $client->request();
//Get Header from response
$headers = $response->getHeaders();
//Create second header
$header = array("Cookie" => $this->getCookieString($headers["Set-cookie"]));
$client->setHeaders($header);
//Second request
$client->setUri($redirectUrl);
$response = $client->request();
Здесь я удаляю "$ client-> resetParameters ();" потому что вы не устанавливаете какие-либо GET-параметры, используя "$ client-> setParameterGet ()" (тоже самое для POST)
Если вы используете "$ client-> setParameterGet ()" или "$ client-> setParameterPost ()", используйте "$ client-> resetParameters ();" перед установкой второго URI.
$ client-> resetParameters () принимает логические значения:
- FALSE: это значение по умолчанию, которое сбрасывает только параметры POST и GET.
- TRUE: сброс всех параметров, включая заголовки, последний запрос и последний ответ.