Laravel Dingo API和Middleware \\ VerifyCsrfToken.php

时间:2018-01-05 17:57:49

标签: php laravel csrf middleware dingo-api

我使用Dingo和Laravel 5.1来创建简单的API。

所以在route.php我有:

$api = app('Dingo\Api\Routing\Router');

$api->version('v1', function($api) {

    $api->get('getvoucher', 'App\Http\Controllers\BitemsController@index');
    $api->get('update/{key}', 'App\Http\Controllers\BitemsController@update');
    $api->post('store', 'App\Http\Controllers\BitemsController@store');

    $api->post('authenticate', 'App\Http\Controllers\AuthenticateController@authenticate');
$api->post('logout', 'App\Http\Controllers\AuthenticateController@logout');
$api->get('token', 'App\Http\Controllers\AuthenticateController@getToken');

});

和我的BitemsController是:

public function index(Request $request)
    {

        $bitem = Bitem::where('key',$request->key)->where('id',$request->pin)->first();

        return $bitem;
    }


    public function store(Request $request)
    {
        $bitem = new Bitem($request->all());
        $bitem->save;
        return $bitem;
    }

现在我使用POSTMAN应用程序来测试API,当我将GET发送到localhost时:8888 / api / getvoucher一切都很好,但是当我发出POST请求来存储一些数据时,我得到了错误:

"message": "500 Internal Server Error",
    "status_code": 500,
    "debug": {
        "line": 53,
        "file": "C:\\wamp\\www\\dine\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php",
        "class": "Illuminate\\Session\\TokenMismatchException",
        "trace": [

邮差: enter image description here

要解决此问题,我尝试添加:

protected $except = [
    'api/*',
];

在中间件VerifyCsrfToken.php中,但是工作。

请告诉我如何解决我的问题...

2 个答案:

答案 0 :(得分:4)

要使邮递员工作,您需要发送正确的CSRF标题,或者删除路线上的标题。

我假设根据您的屏幕截图,您的Dingo API路线正在使用API_PREFIX=api in your .env file

检查Laravel documentation on CSRF tokens以获取有关这些的更多信息。 gist that @BM2ilabs suggested有一些基础知识,介绍如何找出您在会话中用于本地测试的CSRF令牌,以便放入邮递员。

如果您不想使用CSRF保护,则使用$except property on the VerifyCsrfToken middleware as per the Laravel documentation是正确的 - 这也是come up on Stack Overflow before。如果没有看到您正在使用的Kernel和完整的中间件文件,那就很麻烦。如果$except属性确实不适合您,您可以始终覆盖VerifyCsrfToken::handle()方法as per this post并添加您喜欢的路径检查:

public function handle($request, Closure $next)
{
    if ( ! $request->is('api/*'))
    {
        return parent::handle($request, $next);
    }

    return $next($request);
}

如果您创建一个无状态且不需要CSRF保护的API,您可以在{{1}中注释掉VerifyCsrfToken中间件的使用情况完全(可能还有一些其他会话中间件),虽然我建议使用某种身份验证/验证,允许访问者访问API端点。

答案 1 :(得分:1)

您只需要在帖子中添加csrf_token,但邮递员可能会觉得棘手

laravel中的

添加标题与您使用的内容 例如Axios:

it already has that integrated 

jQuery Ajax

    $.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

了解更多info's

<强>更新

经过一番搜索,我发现这篇文章展示了如何让csrf与POSTMAN一起使用

Gists of @ethanstenis