Php Laravel Http客户端使用PUT方法200和GET接收419响应

Php Laravel Http客户端使用PUT方法200和GET接收419响应,php,laravel,laravel-8,guzzlehttp,Php,Laravel,Laravel 8,Guzzlehttp,我正在使用一个名为CallControllerButton.php的livewire控制器,负责调用一个Laravel控制器,问题是CallControllerButton应该用PUT方法调用它,每次statuscode响应是419,get都可以,但不是很好 此处的CallController正在UserController中调用syncFromLdap方法,如下所示: public function callUrl($ajaxUrl) { try {

我正在使用一个名为CallControllerButton.php的livewire控制器,负责调用一个Laravel控制器,问题是CallControllerButton应该用PUT方法调用它,每次statuscode响应是419,get都可以,但不是很好

此处的CallController正在UserController中调用syncFromLdap方法,如下所示:

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);

    }
off-course web.php对应的路由是ok的,并且csrf令牌包含在标头中
我错过了什么?谢谢

好的,现在可以排除url了,如下所示:

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

如果这是对同一服务器的请求,则除csrf令牌外,您还需要发送所有cookie,否则令牌将不匹配,因为没有会话cookie将令牌与会话匹配。GET没有问题,因为它不进行任何CSRF验证。那么如何处理呢?是因为CSRF中间件:因为(我假设)这是通过artisan命令调用的,所以您无法解决这个问题,因为命令行不知道HTTP cookies。您需要努力重写逻辑,这样您就可以直接从控制器调用它,而不是通过API调用它,只是不要使用HTTP客户机联系您自己的应用程序。你拥有代码,直接调用就行了