似乎Cookie解密在Google Chrome中随机失败。
protected function decrypt(Request $request)
{
foreach ($request->cookies as $key => $c) {
if ($this->isDisabled($key)) {
continue;
}
try {
$request->cookies->set($key, $this->decryptCookie($c));
} catch (DecryptException $e) {
dd('exception: ', $e); // added by me to see the failure
$request->cookies->set($key, null);
}
}
return $request;
}
以下是失败时的输出:
"exception: "
DecryptException {#318 ▼
#message: "The payload is invalid."
#code: 0
#file:
"C:\...\vendor\laravel\framework\src\Illuminate\Encryption\Encrypter.php"
#line: 191
有时会有一些关于X-XSRF-TOKEN在解密时失败的帖子:
Laravel DecryptException - The payload is invalid https://www.reddit.com/r/laravel/comments/4xl01y/xxsrftoken_fails_frequently_on_decryption_and/
奇怪的是,每当我刷新页面时,有时会抛出DecryptException,但大多数情况下try语句都会成功。当我在IE和Firefox中测试时,try语句总是成功。
我从Chrome中删除了Cookie等,但这并没有解决问题。
我很感激任何想法,因为我花了很多时间来处理这个问题。
更新1 :当我删除'remember_web _...'cookie时,我不再获得异常。不过,我不知道为什么记住cookie会在Chrome中引起解密异常。
更新2 :更多拼图。当decrypt()抛出异常时,它正在解密的cookie只是请求cookie的一部分,它解释了异常。例如,客户端请求标头中的cookie是
eyJpdiI6IjRaZ3dpVlNMRjB0TEJiNCtRVlUrN2c9PSIsInZhbHVlIjoicHJNYUdOMDc3azdJXC9
sV0lYTThZTDB6aERXV1JwTFhTb2xVbEdEaXhVekJmTkFoVGVQalFEK2ZqamNPWUFHcVREZE9cL3
pjQjRGdHBcL25scENJN0UxRGc9PSIsIm1hYyI6IjI5MzdhNzJiNmNhOTMyNmE2NjhmNzI4ZGRlM
2ZlZWVjM2Q3NGFiYmEzMGZhZmIxZWZlYWNmYzNlZjAzOWU0OWIifQ%3D%3D
但正在解密的cookie缺少客户端请求cookie的最后89个字符:
eyJpdiI6IjRaZ3dpVlNMRjB0TEJiNCtRVlUrN2c9PSIsInZhbHVlIjoicHJNYUdOMDc3azdJXC9
sV0lYTThZTDB6aERXV1JwTFhTb2xVbEdEaXhVekJmTkFoVGVQalFEK2ZqamNPWUFHcVREZE9cL3
pjQjRGdHBcL25scENJN0UxRGc9PSIsIm1hYyI6IjI5Mzd
以下是说明问题的屏幕截图: cookie mismatch
我认为现在的问题是,为什么服务器端Request头中的cookie会从客户端请求标头中丢失部分Cookie?
更新3 :Cookie中缺少的字符数似乎取决于Cookie名称长度。当我使用一个非常长的cookie名称时,缺少的字符数量会增加,反之亦然。这也解释了为什么删除记住cookie或XSRF cookie可以解决问题。同样,这有时只会失败所以我不确定为什么它不是恒定的。