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 在所有的 POSTPUTDELETE 的路由方法中,都會預設加入 CSRF Token 的檢查,他會檢查 POST 過來的資料中 _token 的資料值與 Session 中的 token 是否相符,或是驗證標頭中的 X-CSRF-TOKEN 是否相符。

所以在我們每一次做 POSTPUTDELETE 的請求時,我們都必須要將 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 當作參數傳送到 POSTPUTDELETE 的路由當中,就可以正常執行單元測試了!

參考資料

KeJyun 最新新書推薦
- Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站
- Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。

雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。

本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。

Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站

購書連結

Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

購書連結

comments powered by Disqus