我发现问题的原因。 XSRF-TOKEN Cookie值有时会在最后附加一个流氓字符:'%3D' - 有时最后会有两个这样的字符。不知道他们如何到达那里,但当他们在场时,验证失败。
如果您对cookie值进行base64_decode,则会得到一个json字符串,该字符串具有流氓字符'7',因此Laravel的解密方法失败。
我最后不得不写我自己的CSRF验证功能:
$payload = base64_decode($request->header('X-XSRF-TOKEN'));
//Remove any rogue chars from the end of the json
for($i=0; $i<strlen($payload); $i++){
$lastChar = substr($payload, -1);
if($lastChar != '}'){
$payload = substr($payload, 0, -1);
} else {
break;
}
}
//Needs to be base64 encoded when passed to decrypt
$payload = base64_encode($payload);
$headerToken = decrypt($payload);
$cookieToken = $request->cookie('XSRF-TOKEN');
//Compare tokens
if($headerToken == $cookieToken){
return true;
} else {
return false;
}
您发送'XSRF-TOKEN'或'X-CSRF-TOKEN'吗? –
我发送一个头名称:X-XSRF-TOKEN,该值取自名为XSRF-TOKEN的cookie – ezero
发送'X-CSRF-TOKEN'头。 “XSRF-TOKEN”cookie未加密,但laravel预计“X-XSRF-TOKEN”头将被加密。 – apokryfos