2017-06-20 441 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轉換爲=