Что послать, чтобы сервер знал, что поддерживаются Cookie?

Bermuda

Новичок
Что послать, чтобы сервер знал, что поддерживаются Cookie?

Пользователь авторизован на сайте. Стоит задача авторизации этого пользователя на форуме phpBB2 прикрученном к сайту. Не хотелось бы ковырять код phpBB, но было бы удобнее использовать родной механизм авторизации на phpBB. Т. е. из скрипта делать POST запрос, получать от форума сессионные куки и отдавать их обратно в браузер. Таким образом форум начинает сессию, а браузер имеет куки связанные с этой сессией. Теоретически этого достаточно для авторизации.

Алгорит следующий.
1. Запрашиваю любую страницу форума.
2. Форум начинает PHP сессию и возвращает мне страницу каждая ссылка которой содержит идентификатор сессии.
3. С помощью regexp ищу этот идентефикатор.
4. Делаю пост запрос и в URL как параметр передаю идентификатор сессии.
5. Форум должен залогинить и вернуть в своем ответе куки с идентификатором сессии.

Все хорошо, форум пускает, но возвращает идентификатор сессии снова в ссылках, а не в куках. Т. е. он думает, что мой "браузер" не принимает куки.

Вопрос: что нужно послать серверу, чтобы тот знал, что браузер принимает куки?

Привожу пробный код

PHP:
<?php

require_once('HTTP/Client.php');
$request =& new HTTP_Client();

$url = "/externos/phpbb2/login.php";

$data = array(
    "Accept" => "*/*",
    "Accept-Encoding" => "gzip, deflate",
    "Accept-Language" => "es",
    "Connection" => "Keep-Alive",
    "Host" => "igor.ottd.net2u.cvs",
    "User-Agent" => "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon)");

$request->setDefaultHeader($data);
$request->get($url);
$response = $request->currentResponse();

preg_match( '/sid=(.{32,32})"/', $response['body'], $res);
$sid = $res[1];
$url .= "?sid=".$res[1];

$post_data = array(
    "username" => "igor",
    "password" => "igor",
    "redirect" => "",
    "login" => "Login",
    );

$request->post($url, $post_data);
$response = $request->currentResponse();
print_r($response);

?>
P. S. Используется PEAR:HTTP_Client
 

Bermuda

Новичок
Последний вопрос лишь для акцентирования внимания на том, что сервер вместо id сессии в куке шлет этот id в ссылках.

Фанат
Разве я плохо описал проблему? По делу есть что-нибудь?
 

Bermuda

Новичок
Автор оригинала: Фанат
а то я лопну от смеха =)
Будь так добр, лопни уж.

-~{}~ 27.05.05 16:33:

The session module supports both methods. Cookies are optimal, but because they are not always available, we also provide an alternative way. The second method embeds the session id directly into URLs.

Какого рожна PHP пологает, что "Cookies not available"?
 

Bermuda

Новичок
Должен слать id сессии как через куки, так и парсить ссылки. Если после посылки куки при следующем запросе клиент не передает этот id через куки, то все основания пологать что клиент их не поддерживает. Ему послали -- он не вернул. Проблема в том, что кука изначально не посылается. Почему?

-~{}~ 27.05.05 16:39:

И вообще, должен посылать куки с id сессии при каждом ответе. И парсить ссылки в случае если id сессии получен от клиента через GET.

-~{}~ 27.05.05 16:40:

Вот я и спрашиваю, чего ему такого послать, чтобы полагал что клиент поддерживает cookie.
 

Фанат

oncle terrible
Команда форума
в том, что кука изначально не посылается.
откуда такие сведения?
Вот я и спрашиваю, чего ему такого послать, чтобы полагал что клиент поддерживает cookie.
пошли ему надушенную любовную записочку
 

Bermuda

Новичок
PHP:
$request->post($url, $post_data);
$response = $request->currentResponse();
print_r($response);
PHP:
Array
(
    [code] => 200
    [headers] => Array
        (
            [Date] => Fri, 27 May 2005 11:51:48 GMT
            [date] => Fri, 27 May 2005 11:51:48 GMT
            [Server] => Apache
            [server] => Apache
            [X-Powered-By] => PHP/4.3.11
            [x-powered-by] => PHP/4.3.11
            [Cache-Control] => private, pre-check=0, post-check=0, max-age=0
            [cache-control] => private, pre-check=0, post-check=0, max-age=0
            [Expires] => 0
            [expires] => 0
            [Pragma] => no-cache
            [pragma] => no-cache
            [Connection] => close
            [connection] => close
            [Content-Type] => text/html
            [content-type] => text/html
        )

    [body] => <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">.........
 

Фанат

oncle terrible
Команда форума
никаких заголовков, запрещающих или запроашивающих куки, не существует.
я думаю, проблема либо в либе, которую ты используешь, либо ты не там ищешь куки.
либо не тогда.
искать надо при первом запросе.
 

Bermuda

Новичок
(Response Status) HTTP/1.0 302 Found
Connection close
Content-Type text/html
Date Fri, 27 May 2005 15:02:49 GMT
Location http://david.ottd.net2u.cvs/externos/phpBB2/index.php?sid=a14a696f60622416034534d98c5c3616
Server Apache
Set-Cookie phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%224%22%3B%7D; expires=Sat, 27-May-06 15:02:49 GMT; path=/
Set-Cookie phpbb2mysql_sid=a14a696f60622416034534d98c5c3616; path=/
X-Powered-By PHP/4.3.11

-~{}~ 27.05.05 17:04:

Спасибо, точно не тогда. Видимо так какой-то Header("location:") где-то есть.
 

Фанат

oncle terrible
Команда форума
прикольно.
оно тебе даже и Location не посылает.
безобразие
 

Bermuda

Новичок
Короче, победить я его не победил, куку у него выпросить не удалось, да и лень копаться. Но зато я его на***л!
Алгоритм следующий.
1. Запрашиваю любую страницу форума.
2. Форум начинает PHP сессию и возвращает мне страницу ссылки которой содержат идентификатор сессии.
3. С помощью regexp выковыриваю этот идентефикатор.
4. Делаю пост запрос и в URL как параметр передаю идентификатор сессии.
5. Ставлю куку с именем переменной которую использует форум и значением которое выковырял на полученной странице.

Работает. Вот код.

PHP:
require_once("HTTP/Client.php");

$request = & new HTTP_Client();

$nombre_sesion = "sid";
$url = "/externos/phpbb2/login.php";

$request->get($url);
$response = $request->currentResponse();

preg_match( '/' . $nombre_sesion . '=(.{32,32})"/', $response['body'], $res);
$id_sesion = $res[1];
$url .= "?" . $nombre_sesion . "=" . $id_sesion;

$post_data = array(
    "username" => "username",
    "password" => "password",
    "login" => "Login",
    );

$request->post($url, $post_data);
$response = $request->currentResponse();
setcookie("phpbb2mysql_sid", $id_sesion, null, "/");
Может кому пригодится.
 

Фанат

oncle terrible
Команда форума
Я как раз хотел поинтетесоваться - нафига такие страдания, если можно просто проверить пароль по базе форума и записать нужные значения в сессию =)
 

Bermuda

Новичок
Да понимаешь, я просто не хочу вникать как у него там раотает авторизация. Хотел использовать его естественный механизм авторизации - засабмитил форму -- получел ответ, перенаправил то, что нужно (куки) в браузер. Мало ли что там наваротили. Просто у нас есть "коробочная версия" к которой периодически приходится прикручивать разную хрень типа форумов и прочей байды в которой есть авторизация. Но если использовать стандартный механизм, то можно обстрагироваться от типа софта, ограничившись указанием данных для авторизации. Таким образом прикрутить новый кусок это всего лишь поменять имена переменных.
 
Сверху