Laravel, PHP

自訂 Laravel 5 TokenMisatchException 的錯誤訊息

Laravel 中提供了 CSRF Protection 非常安全、快速又好用!
但是也因為保護的關係, 常常會遇到 TokenMisatchException in VerifyCsrfTOken.php 的錯誤訊息
當然有很多種方式排除(except )掉 csrf token 的檢查, 但如果想在 TokenMisatchException 出現時自訂錯誤訊息, 就可以方便控制前端 UI 上的呈現!

 

當 Laravel Debug 模式 關閉時 TokenMisatchException 的錯誤訊息並沒辦法被前端做處理.
所以在這種時候前端 javascript, ajax 就會出錯, 讓前端的流程整個停住、爛掉!!

所以今天的情境是 ajax 呼叫時缺少 token 或是 頁面閒置過久 token 過期時, TokenMisatchException 的錯誤訊息就會出現.
而 javascript 的 ajax function 就會沒有回應….

這時, 可以經過一些小修改自訂 TokenMisatchException 的錯誤訊息

打開
app\Http\Middleware\VerifyCsrfToken.php
加入…

public function handle($request, \Closure $next)
{
  if ($this->isReading($request) || $this->shouldPassThrough($request) || $this->tokensMatch($request)) {
    return $this->addCookieToResponse($request, $next($request));
  }

  if($request->ajax()) {
    return response()->json(['message' => [trans('error.idle-2-long')] ], 422);
  }

  throw new \Exception(trans('error.idle-2-long'), 422);
}

handle function 是繼承 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken 來的
所以在這裡覆寫他

 

檢查 request 是否為 ajax
回傳 json 格式 內容包含 message = “你的自訂錯誤訊息”
http code 為 422

if($request->ajax()) {
  return response()->json(['message' => ["錯誤訊息"] ], 422);
}

 

 

最後為當缺少 token 或 token 錯誤時且 request 不是 ajax 時回傳的錯誤訊息
回傳 “你的自訂錯誤訊息” 格式為 text
http code 也是 422

throw new \Exception("自訂錯誤訊息", 422);

 

 

 

不是什麼很難的動作, 做個紀錄

  • 422 code 可以依需求改成更適合
  • 如果有多國語言需求或是方便管理訊息可以使用 trans()
  • 這樣修改方便前端 ajax 的錯誤控制, 當然也會有 安全性上的問題(使用者知道你的 token 有誤)

 

 

One Comment

Leave a Reply