#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/*',
];
}