使用带有laravel 5.2的jwt时发送POST请求

时间:2016-05-03 13:29:58

标签: laravel authentication jwt

我正在使用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请求失败?请帮忙。!

2 个答案:

答案 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() }}" />