PHP Laravel api отправил сообщение json с curl

#php #laravel

#php #laravel

Вопрос:

Моя проблема заключается в следующем

У меня есть API счетчика, и он использует laravel. Мне нужно отправить сообщение в виде json в этот API, но когда я отправляю без заголовков, 419 страница возвращается как просроченная, когда я отправляю заголовки, я получаю csrf token missmatch ошибку. Однако я беру токен csrf из meta и помещаю его в заголовки.

Я хочу отметить, что я не использую Laravel, API, который я опубликую, использует Laravel.

Мой код:

 <?php 
$data = 'JSON DATA'; 
$wow = json_encode($data);

$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_URL,"laravel api url");

$dom = new DOMDocument;
$dom->loadHTML($resultado);
$tags = $dom->getElementsByTagName('meta');
for ($i = 0; $i < $tags->length; $i  ) {
    $grab = $tags->item($i);
    if ($grab->getAttribute('name') == 'csrf-token') {
        $token = $grab->getAttribute('content');
    }
}

ob_start();      // prevent any output
curl_exec ($ch); // execute the curl command
ob_end_clean();  // stop preventing output

curl_close ($ch);
unset($ch);

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
curl_setopt($ch, CURLOPT_URL,"LARAVEL API URL");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $wow);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept: application/json, text/plain, */*',
    'Accept-Encoding: gzip, deflate, br',
    'X-CSRF-TOKEN: '.$token.''));

$buf2 = curl_exec ($ch);

curl_close ($ch);

echo htmlentities($buf2);
?>  
  

Комментарии:

1. Почему бы просто не исключить, что конкретному маршруту даже не нужен CSRF?

2. @Ron потому что на этот раз я получаю ошибку с истекшим сроком действия страницы 419.

3. 419 — это как раз из-за CSRF ..

4. @Ron Я предполагаю, что так, потому что, когда я удаляю строку csrf через заголовки, я получаю 419.

5. Вы можете объявить в Laravel, что определенный маршрут даже не проверяется на наличие CSRF .. как только вы это сделаете, ошибки 419 не может быть … поскольку срок действия токена не истекает..

Ответ №1:

Вы можете CSRF token полностью отключить для определенного route , если это имеет смысл для вашего приложения.

Проверьте документы и отредактируйте app/Http/Middleware/VerifyCsrfToken.php

 <?php

namespace AppHttpMiddleware;

use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}