【问题标题】:Laravel Http Client receive 419 response with PUT method 200 with GETLaravel Http 客户端使用 PUT 方法接收 419 响应 200 使用 GET
【发布时间】:2020-10-29 10:08:35
【问题描述】:

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

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

    }

当然 web.php 对应的路由没问题,并且 csrf 令牌包含在 headers 中 我错过了什么?谢谢

【问题讨论】:

  • 如果这是对同一服务器的请求,除了 csrf 令牌之外,您还需要发送所有 cookie,否则令牌将不匹配,因为没有会话 cookie 将令牌与会话匹配. GET 没问题,因为它不做任何 CSRF 验证
  • ok 那么怎么处理呢?
  • 是不是因为csrf中间件:stackoverflow.com/questions/46266553/…
  • 由于(我假设)这是通过工匠命令调用的,因此您无法解决此问题,因为命令行不知道 HTTP cookie。您需要努力重写逻辑,以便您可以直接从控制器调用它而不是通过工匠
  • 只是不要使用 HTTP 客户端来联系您自己的应用程序。您拥有代码,直接调用即可

标签: php laravel laravel-8 guzzle


【解决方案1】:

好的,它现在可以通过排除这样的网址来工作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2020-01-08
    相关资源
    最近更新 更多