2017-06-20 150 views
1

我送一个AJAX POST请求回到我Laravel API和收到此错误讯息话题:Laravel DecryptException - 有效载荷是无效

DecryptException在compiled.php线13235: 有效载荷是无效的。

我正在从cookie中读取XSRF-TOKEN,并将其作为名为X-XSRF-TOKEN的请求标头发送。

该网站是Laravel API的完全独立网站,但共享相同的会话,这就是为什么我从cookie获取价值。

奇怪的是,它偶尔会起作用。任何想法是什么造成这种情况?

+0

您发送'XSRF-TOKEN'或'X-CSRF-TOKEN'吗? –

+0

我发送一个头名称:X-XSRF-TOKEN,该值取自名为XSRF-TOKEN的cookie – ezero

+0

发送'X-CSRF-TOKEN'头。 “XSRF-TOKEN”cookie未加密,但laravel预计“X-XSRF-TOKEN”头将被加密。 – apokryfos

回答

2

我发现问题的原因。 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; 
      } 
+0

我还将这个奇怪的字符附加到我的XSRF-TOKEN cookie值的末尾。 任何人都知道它的原因是什么? –

1

如果你从JavaScript发送X-XSRF-TOKEN您可以使用decodeURIComponent()解码。它将%3D转换为=