【问题标题】:Laravel API TokenMismatchExceptionLaravel API TokenMismatchException
【发布时间】:2015-03-12 17:30:19
【问题描述】:

我有一个包含发布数据的 API 调用;假设这是登录过程。

使用 Chrome 的 Postman 扩展,我通过 POST 发送用户名和密码以登录用户。 但我收到了这条消息:

Illuminate \ Session \ TokenMismatchException

在我的基本控制器中,我有:

    /**
     * Initializer.
     *
     * @return void
     */
    public function __construct() {
        // CSRF Protection
        $this->beforeFilter('csrf', array('on' => 'post'));

        // Layouts/Notifications
        $this->messageBag = new Illuminate\Support\MessageBag;

    }

当我使用 beforeFilter 删除行时,一切正常。 但这不能成为解决方案。 任何 POST 调用都会收到此错误消息。 我知道我需要这个 _token。但是当我从 API 调用时,我如何获得这个令牌?我知道我可以在 Laravel 中创建一个令牌,但是当我通过 API 从外部调用时,我该怎么做呢?

【问题讨论】:

  • 因为需要将token作为参数发送过去,因为csrf过滤器会检查输入的_token字段。如果您不发送它,此检查将失败。
  • 好的。对不起,模棱两可的描述......我知道我需要这个 _token。但是当我调用 API 时如何获得这个令牌?我知道我可以在 laravel 中创建一个令牌,但是当我通过 API 从外部调用时我该怎么做呢?
  • API 通常用于跨站点请求。所以你的 CSRF 保护是没有意义的。它主要用于应用程序和网站。但是在登录时禁用它,然后在成功登录时通过调用帮助器csrf_token(); 向用户发送 csrf_token 值
  • 谢谢。如何在某些请求中禁用 $this->beforeFilter('csrf', array('on' => 'post'));?我的基本控制器的 __construct 函数中有这一行吗?所以我希望这通常是一个前置过滤器,但在某些情况下应该禁用前置过滤器。有可能吗?

标签: php api laravel token


【解决方案1】:

绝对don't use这种方法。

打开 VerifyCsrfToken 类并定义 $except 属性,该属性将包含一个路由数组,其中不会应用 CSRF 保护。

下面的例子:

<?php
declare(strict_types=1);

namespace App\Http\Middleware;

use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    protected $except = [
        'api/auth/login',
        'api/*', // this works as well
    ];

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure                 $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return parent::handle($request, $next);
    }
}

【讨论】:

    【解决方案2】:

    API 通常用于跨站点请求。所以你的 CSRF 保护是没有意义的。

    如果您不打算跨站点使用它,那么 API 很可能不是您尝试做的最佳解决方案。无论如何,您可以创建一个返回令牌的 API 端点。

    public function getToken(){
        return Response::json(['token'=>csrf_token()]);
    }
    

    如果您想在某些方法上禁用 CSRF 保护,您可以使用 exceptonly

    $this->beforeFilter('csrf', array('on' => 'post', 
                                     'except'=>array('methodName', 'anotherMethod')
                                      ));
    

    请参考official Laravel documentation

    【讨论】:

      【解决方案3】:

      只要听听这个。就在 30 分钟之前,我遇到了同样的问题。现在它解决了。试试这个。

      转到应用程序-> HTTP-> 内核

      打开内核文件。

      在那里你可以看到: \App\Http\Middleware\VerifyCsrfToken::class,

      只需使用 //

      禁用此特定代码

      就是这样!这会奏效!

      这样您就可以从 API 调用中删除中间件(如果您愿意的话..)

      【讨论】:

        猜你喜欢
        • 2016-09-19
        • 2015-10-04
        • 2016-03-06
        • 2017-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多