Использование PHP cURL для получения CSRF-токена из URL-адреса и отправки его на другой URL-адрес в том же сеансе

Я пытаюсь создать систему очередей на основе информации, собранной с веб-сайта supermariomakerbookmark.nintendo.net. Сначала я делаю запрос GET в URL-адресе https://supermariomakerbookmark.nintendo.net/courses/7E00-0000-0220-574B, чтобы найти CSRF-токен, присутствующий в поле:

<meta name="csrf-token" content="xxxxxx">

После этого мне нужно сделать запрос POST на https://supermariomakerbookmark.nintendo.net/courses/7E00-0000-0220-574B/play_at_later, передав CSRF-токен и файл cookie в заголовке. Файл cookie предоставляется пользователем и извлекается из базы данных.

Вот мой код:

$cookie = DB::table('CONFIG')->select('cookies')->first()->cookies;

// get csrf token
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://supermariomakerbookmark.nintendo.net/courses/$id");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$html = curl_exec($ch);

$dom = new \DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);

$metas = $dom->getElementsByTagName('meta');

for ($i = 0; $i < $metas->length; $i++){
  $meta = $metas->item($i);
  if($meta->getAttribute('name') == 'csrf-token')
    $csrfToken = $meta->getAttribute('content');
}

$headers = array();
$headers[] = "X-CSRF-Token: $csrfToken";
$headers[] = "Cookie: $cookie";

curl_setopt($ch, CURLOPT_URL, "https://supermariomakerbookmark.nintendo.net/courses/$id/play_at_later");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$ret = curl_exec($ch);

Но это не работает. Запрос curl POST возвращает пользовательскую страницу с ошибкой 500 вместо 200 OK. Я выполняю этот код внутри контроллера в Laravel.

Если я попытаюсь сделать запрос POST с помощью Postman, он сработает. Муравьиная идея о том, как заставить это работать?


person Danilo Teixeira Lopes    schedule 23.08.2016    source источник
comment
Возвращает ли запрос curl 500 или сам файл PHP возвращает 500?   -  person WillardSolutions    schedule 23.08.2016
comment
Забыл упомянуть об этом, извините. Я получаю пользовательскую страницу с ошибкой 500 в качестве ответа на POST-запрос curl вместо ожидаемого статуса 200 OK.   -  person Danilo Teixeira Lopes    schedule 23.08.2016
comment
Вероятно, это не связано, но действительно ли ваш заголовок $cookie должен иметь тот же ключ «X-CSRF-Token»?   -  person WillardSolutions    schedule 23.08.2016
comment
Это была опечатка, я удалил ее для проверки, а когда вернул, просто скопировал/вставил из другого заголовка. Я обновил код с правильным ключом. Но все равно не работает :/   -  person Danilo Teixeira Lopes    schedule 23.08.2016


Ответы (1)


У меня была аналогичная проблема с другим веб-сервисом. В моем случае проблема заключалась в названии заголовка.

Попробуйте изменить этот код и протестировать его:

$headers = array();
$headers[] = "Cookie: X-CSRF-Token=$csrfToken";
$headers[] = "Cookie: X-CSRF-Token=$cookie";
person James    schedule 23.08.2016
comment
Не сработало :/ И просто обновление, я заметил, что я могу заставить его работать в почтальоне, только если перехватчик активирован... Не знаю, что еще я могу попробовать - person Danilo Teixeira Lopes; 23.08.2016