【问题标题】:Sending POST request while using jwt with laravel 5.2将 jwt 与 laravel 5.2 一起使用时发送 POST 请求
【发布时间】:2016-08-28 14:02:48
【问题描述】:

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

【问题讨论】:

  • 您如何通过 POST 发送令牌?你能把代码贴出来吗..
  • 您能否发布 VerifyCsrfToken.php,因为这是首先引发错误的地方?
  • class VerifyCsrfToken extends BaseVerifier { /** * 应该从 CSRF 验证中排除的 URI。 * * @var 数组 */ protected $except = [ 'api/login', 'api/signup', ]; }
  • @Manojsalvi 我正在通过 Postman 浏览器插件发送令牌,dropbox.com/sh/a901epayh1liapd/AABCwxxBN4pSG735SxQlC2jha?dl=0

标签: laravel authentication jwt


【解决方案1】:

这是因为 Laravel CSRF 保护默认为所有路由启用。您可以为您的 POST 请求禁用它或发送 CSRF 令牌 throw 'X-XSRF-TOKEN' 标头。但似乎你没有它,因为你使用了 jwt 令牌(它不一样)。我建议你从 csrf 中间件中排除你的 API 路径:

从 CSRF 保护中排除 URI

有时您可能希望从 CSRF 保护中排除一组 URI。例如,如果您使用 Stripe 处理付款并使用他们的 webhook 系统,则需要从 Laravel 的 CSRF 保护中排除您的 webhook 处理程序路由。

您可以通过在包含在默认 routes.php 文件中的 web 中间件组之外定义它们的路由来排除 URI,或者通过将 URI 添加到 VerifyCsrfToken 中间件的 $except 属性:

<?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

【讨论】:

    【解决方案2】:

    对于发布请求,您需要传递 _token 隐藏字段。

    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
    

    【讨论】:

    • 我知道,但是,它不是 csrf_token.. 它是 JWT 令牌..!对 jwt auth 有自己的看法
    猜你喜欢
    • 2020-09-04
    • 2020-07-14
    • 2012-08-22
    • 1970-01-01
    • 2017-10-19
    • 2018-03-21
    • 2017-06-02
    • 2020-10-06
    相关资源
    最近更新 更多