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

Posted

技术标签:

【中文标题】Laravel Dingo API 和中间件问题\\\\VerifyCsrfToken.php【英文标题】:Laravel Dingo API and issues with Middleware\\VerifyCsrfToken.phpLaravel Dingo API 和中间件问题\\VerifyCsrfToken.php 【发布时间】:2018-06-15 13:53:13 【问题描述】:

我使用 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,当我向 localhost:8888/api/getvoucher 发送 GET 时一切正常,但是当我发出 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": [

邮递员:

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

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

在中间件 VerifyCsrfToken.php 中,但无法正常工作。

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

【问题讨论】:

任何想法如何解决问题?同样的错误出现在 api/authenticate POST route ... 您能否验证您的应用程序正在使用您的扩展VerifyCsrfToken.php 中间件? 是的,我正在使用它......在内核中 【参考方案1】:

要让 Postman 正常工作,您需要发送正确的 CSRF 标头,或者在您的路线上删除对它的需求。

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

查看Laravel documentation on CSRF tokens 了解更多信息。 gist that @BM2ilabs suggested 提供了一些关于如何找出您在会话中用于本地测试的 CSRF 令牌以放入 Postman 的基础知识。

如果您不想使用 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,您可以在您的 Kernel 中完全注释掉 VerifyCsrfToken 中间件的使用(并且可能是其他一些会话中间件),尽管我建议您使用某种身份验证/验证,以允许您的访问者访问 API 端点。

【讨论】:

问题来自我的 FTP 客户端... FilleZilla 告诉我上传成功但它没有... 我手动检查并看到 VerifyCsrfToen 没有更改!【参考方案2】:

您只需要在帖子中添加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 与 POSTMANas 一起工作

Gists of @ethanstenis

【讨论】:

以上是关于Laravel Dingo API 和中间件问题\\VerifyCsrfToken.php的主要内容,如果未能解决你的问题,请参考以下文章

laravel/dingo API 上的变压器使用

php Laravel Dingo API JWT使用电子邮件和获取令牌登录用户

雄辩的模型属性作为骆驼案例 [Laravel 5.2] [Dingo API]

内部请求需要 Laravel Dingo 身份验证 JWT

php 使用Laravel Nova API防止Dingo API冲突

laravel dingo/api添加jwt-auth认证