我發現問題的原因。 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