Laravel 5.3+ 如何定義API路徑(取消CSRF保護)
從Laravel 5.3+
開始,API
路徑被放入了routes/api.php
中。我們絕大多數的路徑其實都會在web.php
中定義,因為在web.php
中定義的路徑預設有CSRF
保護,而API
路徑預設沒有CSRF
保護。在Laravel
官網文件中寫到:
Any HTML forms pointing to POST, PUT, or DELETE routes that are defined in the web routes file should include a CSRF token field. Otherwise, the request will be rejected.
所以,請注意你頁面的表單中是否使用了POST
、PUT
或DELETE
方法,如果有,並且你沒有在表單中新增相應的CSRF token
時,你的請求將會失敗。
有時候,我們可能不想要CSRF
保護。比如我們想使用第三方軟體測試表單提交,或者比如微信公眾號介面的開發時,當微信伺服器使用POST
推送給我們訊息時,如果開啟了CSRF
保護,那麼請求肯定是失敗的。
在這樣的情況下,我們可以使用API
路徑來取消CSRF
保護。
我們有兩種辦法來定義API Routes
。
第一種辦法:
將
routes
放進VerifyCsrfToken
這個middleware
的$except
數組裡:
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; class VerifyCsrfToken extends BaseVerifier { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ '/api/my-route', ]; }
以上middleware
的位置在app/Http/Middleware
資料夾中。
第二種方法:
將
routes
放進api.php
裡:
<?php
use Illuminate\Http\Request;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::get('/wechat', '[email protected]');
Route::post('/wechat', '[email protected]');
api.php
和web.php
同處於routes
資料夾下。
在api.php
中新增的路徑,在訪問時,我們需要在路徑前,加上api/
字首:
http://my-web-site/api/wechat
好了,這樣一來,我們就完成了API
路徑的定義,或者換句話說,取消了路徑的CSRF
保護。
轉載:https://blog.sbot.io/articles/10