我正在使用jwt:auth和laravel 5.2以安全的方式验证CSRF攻击。
你可以在这里找到怎么做>> http://blog.nedex.io/create-an-api-server-for-mobile-apps-using-laravel-5-1/
我在VerifyCsrfToken.php中间件中编辑了except数组,并添加了api / login和api / signup,所以我可以跳过这两个动作的jwt令牌,因为我正在尝试登录或注册,所以我仍然没有键,然而。
Route::group(['prefix' => 'api'], function() {
Route::post('login', 'Api\AuthController@login');
Route::post('signup', 'Api\UsersController@signup');
Route::group(['middleware' => ['jwt.auth', 'jwt.refresh']], function() {
Route::post('logout', 'Api\AuthController@logout');
Route::get('test', function(){
return response()->json(['foo'=>'bar']);
});
Route::get('hospitals', 'Api\EmergenciesController@getHospitals');
Route::get('emergencyDetails/{id}', 'Api\EmergenciesController@getEmergencyDetails');
Route::get('profile/{id}', 'Api\UsersController@get_profile');
Route::post('submit_profile/{id}', 'Api\UsersController@submit_profile_data');
Route::post('update_property/{id}/{property}/{value}', 'Api\UsersController@update_property');
Route::post('pregnant/{id}', 'Api\UsersController@update_is_pregnant');
});
});
当我用?token =发送GET请求时,它工作得很好 但是当我尝试发送POST请求时它给了我一个TokenMismatchException,虽然我发送了令牌。
点击此处的屏幕截图>> https://www.dropbox.com/sh/a901epayh1liapd/AABCwxxBN4pSG735SxQlC2jha?dl=0
为什么POST请求失败?请帮忙。!
答案 0 :(得分:1)
这是因为Laravel CSRF Protection是所有路由的默认启用。您可以为POST请求禁用它或发送CSRF令牌' X-XSRF-TOKEN'头。但似乎你没有它,因为你使用jwt令牌(它不相同)。我建议你从csrf中间件中排除API路径:
从CSRF保护中排除URI
有时您可能希望从CSRF保护中排除一组URI。例如,如果您使用Stripe处理付款并使用其webhook系统,则需要从Laravel的CSRF保护中排除您的webhook处理程序路径。
您可以通过在默认的routes.php文件中包含的Web中间件组之外定义路由,或者将URI添加到VerifyCsrfToken中间件的$ except属性来排除URI:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'stripe/*',
];
}
只需添加新路径,例如
protected $except = [ 'api/login', 'api/signup', 'api'/logout' , 'api/test', 'api/hospitals']; //etc
答案 1 :(得分:-1)
对于发布请求,您需要传递_token隐藏字段。
<input type="hidden" name="_token" value="{{ csrf_token() }}" />