Laravel DecryptException - 有效负载无效
我正在将AJAX帖子请求发送回我的Laravel API并收到以下错误混乱:
解密编译.php行 13235 中的异常:有效负载无效。
我正在从cookie中读取XSRF-TOKEN,并将其作为名为X-XSRF-TOKEN的请求标头发送。
该网站是一个与Laravel API完全独立的网站,但共享相同的会话,这就是为什么我从cookie中获取价值的原因。
奇怪的是,它偶尔会起作用。任何想法是什么导致这种情况?
我正在将AJAX帖子请求发送回我的Laravel API并收到以下错误混乱:
解密编译.php行 13235 中的异常:有效负载无效。
我正在从cookie中读取XSRF-TOKEN,并将其作为名为X-XSRF-TOKEN的请求标头发送。
该网站是一个与Laravel API完全独立的网站,但共享相同的会话,这就是为什么我从cookie中获取价值的原因。
奇怪的是,它偶尔会起作用。任何想法是什么导致这种情况?
如果您从 JavaScript 发送,则可以使用 对其进行解码。它将转换为 .X-XSRF-TOKEN
decodeURIComponent()
%3D
=
我找出了问题的原因。XSRF-TOKEN Cookie 值有时会在末尾附加一个流氓字符:“%3D” - 有时末尾有两个。不知道他们是如何到达那里的,但是当他们存在时,验证失败。
如果你base64_decode cookie值,你会得到一个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;
}