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 与 POSTMAN
as 一起工作
Gists of @ethanstenis
【讨论】:
以上是关于Laravel Dingo API 和中间件问题\\VerifyCsrfToken.php的主要内容,如果未能解决你的问题,请参考以下文章
php Laravel Dingo API JWT使用电子邮件和获取令牌登录用户
雄辩的模型属性作为骆驼案例 [Laravel 5.2] [Dingo API]