# POST CSRF 錯誤
當我們在使用 Unit test 做 POST 測試時,測試的程式可能像:
~~~
<?php
class UserTest extends TestCase {
/**
* 測試註冊
*/
public function testSignup()
{
$parameters = [
'email'=>'kejyun@gmail.com',
'name'=>'KeJyun'
];
// 傳送參數
$response = $this->call('POST', '/signup', $parameters);
$this->assertEquals(200, $response->getStatusCode());
}
}
~~~
在執行單元測試後,你會收到一個 `TokenMismatchException` 的例外錯誤,這個部分是 Middleware VerifyCsrfToken 的驗證錯誤
這是因為 Laravel 5 在所有的 `POST`、`PUT`、`DELETE` 的路由方法中,都會預設加入 CSRF Token 的檢查,他會檢查 POST 過來的資料中 `_token` 的資料值與 Session 中的 token 是否相符,或是驗證標頭中的 `X-CSRF-TOKEN` 是否相符。
所以在我們每一次做 `POST`、`PUT`、`DELETE` 的請求時,我們都必須要將 CSRF Token 帶入檢查,才能執行後面的程式動作,我們可以用這樣的方式帶入 CSRF Token:
~~~
<?php
class UserTest extends TestCase {
/**
* 測試註冊
*/
public function testSignup()
{
// 開啟 Session
Session::start();
// 參數加入 CSRF token
$parameters = [
'_token'=>csrf_token(),
'email'=>'kejyun@gmail.com',
'name'=>'KeJyun'
];
// 傳送參數
$response = $this->call('POST', '/signup', $parameters);
$this->assertEquals(200, $response->getStatusCode());
}
}
~~~
在使用 `csrf_token()` 方法時,都必須要先使用 `Session::start();` 將 Session 開啟,以紀錄當時的 CSRF Token 做驗證,並將 `_token` 當作參數傳送到 `POST`、`PUT`、`DELETE` 的路由當中,就可以正常執行單元測試了!
### 參考資料
- [HTTP 路由 - Laravel.tw](http://laravel.tw/docs/5.0/routing#csrf-protection)
- [Testing Laravel 5 Routes with CSRF Protection Using PHPUnit](http://davejustdave.com/2015/02/08/laravel-5-unit-testing-with-csrf-protection/)
- 介紹
- 環境
- .env 檔案
- 資料庫
- Migration (遷移)
- Eloquent Model (模型)
- 設定
- 關聯
- 魔術函式
- 使用 Eloquent
- 常見問題
- 無法取得查詢 Log
- 使用大量資料的方式新增時無法新增
- 使用中繼模型繼承 Eloquent 模型造成無法使用大量資料新增
- PostgreSQL
- 安裝 PostgreSQL ODBC driver
- HTTP
- 請求
- 中介層 (Middleware)
- 視圖 (View)
- 服務
- 認證登入(Auth)
- 郵件(Mail)
- 使用 Gmail 寄信
- 使用 Mailgun 寄信
- 隊列(Queue)
- database
- 非同步(async)
- 輔助方法 (Helpers)
- 自定義輔助方法
- 單元測試 (Unit Test)
- Post CSRF 錯誤
- 錯誤與日誌
- 在單元測試顯示例外
- 日誌記錄層級
- 日誌巨集
- 加密
- 雜湊
- Elixir
- 使用 Elixir 合併 CSS 與 JS
- 設計模式
- 服務容器
- PSR
- Model 模型
- 學習資源
- 套件
- Debug
- Artisan tail
- 工具
- Carbon
- 設計模式
- 其他常見問題
- Call to undefined method getCachedCompilePath()
- 變更專案目錄名稱導致 View 無法讀取
- Laravel 5.1 目錄結構異動
- 學習資源
- 官方
- 社群
- 會議議程
- 工作
- 文件
- 文章
- 套件
- 服務工具
- 教學影片
- 教學網站
- 編輯開發
- 主機
- 成功案例