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
一起工作
要使 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端点。
我将 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
一起工作
要使 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端点。