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
的路由當中,就可以正常執行單元測試了!
參考資料
KeJyun 最新新書推薦
|
|
---|---|
Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。 雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。 本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。 |
|
購書連結 |
|
購書連結 |