【发布时间】: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 函数中有这一行吗?所以我希望这通常是一个前置过滤器,但在某些情况下应该禁用前置过滤器。有可能吗?