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