Laravel API TokenMismatchException

时间:2015-01-14 13:50:29

标签: php api laravel token

我有一个带有帖子数据的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从外部打电话时我怎么能这样做呢?

3 个答案:

答案 0 :(得分:9)

通常,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

答案 1 :(得分:5)

绝对 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 :(得分:1)

听听这个。就在30分钟之前,我面临同样的问题。现在它解决了。试试吧。

转到应用 - &gt; HTTP-&GT;内核

打开内核文件。

你可以看到:  \ APP \ HTTP \中间件\ VerifyCsrfToken ::类,

使用//

禁用此特定代码

那就是它!这将有效!

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