Php Laravel Http客户端使用PUT方法200和GET接收419响应
我正在使用一个名为CallControllerButton.php的livewire控制器,负责调用一个Laravel控制器,问题是CallControllerButton应该用PUT方法调用它,每次statuscode响应是419,get都可以,但不是很好 此处的CallController正在UserController中调用syncFromLdap方法,如下所示: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 {
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客户机联系您自己的应用程序。你拥有代码,直接调用就行了