Клиент Laravel Http получает ответ 419 с методом PUT 200 с GET

Я использую контроллер livewire с именем CallControllerButton.php, который отвечает за вызов контроллера Laravel, проблема в том, что CallControllerButton должен вызывать его с помощью метода PUT, и каждый раз, когда ответ кода состояния равен 419 с получением, это нормально, но это не хорошо.

CallController здесь вызывает метод syncFromLdap в UserController следующим образом:

public function callUrl($ajaxUrl)
    {
        try {
            /*$client = new Client([
               'base_uri' => URL::to('/'),
                'headers' => ['X-CSRF-Token'=> csrf_token()],
                'timeout' => 5.0,
                'verify'  => false
            ]);
            $request = $client->put($ajaxUrl);*/

            $request = Http::withOptions([
                'headers' => ['X-CSRF-Token'=> csrf_token()],
                'timeout' => 5.0,
                'verify'  => false
            ])->put(URL::to('/').'/'.$ajaxUrl)
            ;

            // PUT successful response is 200 error is 304
            if($request->getStatusCode() == 200){
                session()->flash('message', 'User sync ok');
            }else{
                session()->flash('error', $request->getStatusCode().'/'.$request->getBody());
            }

        }catch (HttpClientException $httpClientException){
            session()->flash('error', 'GuzzleException message : '.$httpClientException->getMessage().' - error code:'.$httpClientException->getCode());
        }

    }

и метод syncFromLdap:

public function syncFromLdap(User $user)
    {

        Artisan::call('ldap:import', [
            'provider' => 'ldap',
            'user' => $user->name,
            '--no-interaction',
            '--filter' => '(mail='.$user->email.')',
            //'--attributes' => 'cn,mail,samaccountname',
        ]);
        $output = Artisan::output();

        if (str_contains($output,'Successfully imported / synchronized [1]')){
            
            return new Response(null,200);
        }

        return new Response(null,304);

    }

конечно, соответствующий маршрут web.php в порядке, и токен csrf включен в заголовки. Что я пропустил? Спасибо


person Eloise85    schedule 29.10.2020    source источник
comment
Если это запрос к тому же серверу, вам необходимо также отправить все файлы cookie в дополнение к токену csrf, иначе токен не будет соответствовать, поскольку не будет файла cookie сеанса для сопоставления токена с сеансом. GET в порядке, потому что он не выполняет никакой проверки CSRF   -  person apokryfos    schedule 29.10.2020
comment
хорошо, как быть с?   -  person Eloise85    schedule 29.10.2020
comment
это из-за промежуточного программного обеспечения csrf: stackoverflow.com/questions/46266553/   -  person Md. Salahuddin    schedule 29.10.2020
comment
Поскольку это (я предполагаю) вызывается с помощью команды artisan, вы не можете решить эту проблему, поскольку командная строка не знает о файлах cookie HTTP. Вам нужно приложить усилия, чтобы переписать логику, чтобы вы могли вызывать ее напрямую из контроллера, а не через ремесленника.   -  person apokryfos    schedule 29.10.2020
comment
Команда artisan возвращает вывод, который содержит успешно, это как раз то, что мне нужно, команда artisan не является виновником работы метода GET, но это грязный запрос, который должен обновить запись пользователя. Я попытался исключить URL-адрес из класса VerifyCsrfToken, но он не работает.   -  person Eloise85    schedule 29.10.2020
comment
Просто не используйте HTTP-клиент для связи с вашим собственным приложением. Вы владеете кодом, просто вызовите его напрямую   -  person apokryfos    schedule 29.10.2020
comment
Через Route::put(...) ?   -  person Eloise85    schedule 29.10.2020
comment
Вы правы, он отлично работает, просто вызывая контроллер и метод, я такой тупой!   -  person Eloise85    schedule 29.10.2020


Ответы (1)


ОК, теперь он работает, исключая такой URL-адрес:

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'userSync/*'
    ];
}
person Eloise85    schedule 29.10.2020