【发布时间】: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