Laravel Dingo API 和中间件问题\\VerifyCsrfToken.php

Laravel Dingo API and issues with Middleware\\VerifyCsrfToken.php

我将 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": [

POST男人:

为了解决这个问题,我尝试添加:

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

中间件内部 VerifyCsrfToken.php 但无法正常工作。

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

你只需要将 csrf_token 添加到 post ,但是对于 postman

这可能会很棘手

在 laravel 中添加 header 与您使用的内容 例如 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

要使 Postman 正常工作,您需要发送正确的 CSRF header,或者在您的路由中删除对它的需求。

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

检查 Laravel documentation on CSRF tokens for more information about those. The gist that @BM2ilabs suggested 有一些关于如何找出您在 session 中用于本地测试的 CSRF 令牌以放入 Postman 的一些基础知识。

如果您不想使用 CSRF 保护,您使用 $except property on the VerifyCsrfToken middleware as per the Laravel documentation - this has also come up on Stack Overflow before. Tricky to troubleshoot that without seeing your Kernel and the full middleware file you're using. If the $except property really isn't working for you, you can always override the VerifyCsrfToken::handle() method as per this post 并添加您喜欢的任何路由检查是正确的:

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

    return $next($request);
}

如果你只是创建一个API,它将是无状态的并且不需要CSRF保护,你可以注释掉[=14的用法=] 完全在你的 Kernel 中间件(可能还有一些其他 session 中间件),尽管我建议使用某种 authentication/validation 应该允许你的访问者访问 API端点。