Laravel API TokenMismatchException
Laravel API TokenMismatchException
我有一个 API 通话,有 post 数据;假设这是登录过程。
使用 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 从外部调用时我该如何做?
通常 API 用于跨站点请求。所以你的 CSRF 保护是毫无意义的。
如果您不打算跨站点使用它,那么 API 很可能不是您要执行的操作的最佳解决方案。无论如何,您 可以 创建一个 API 端点,其中 returns 一个令牌。
public function getToken(){
return Response::json(['token'=>csrf_token()]);
}
如果您想禁用某些方法的 CSRF 保护,您可以使用 except
或 only
。
$this->beforeFilter('csrf', array('on' => 'post',
'except'=>array('methodName', 'anotherMethod')
));
听听这个。就在 30 分钟之前,我遇到了同样的问题。现在解决了。试试这个。
转到应用程序 -> HTTP-> 内核
打开内核文件。
在那里你可以看到:
\App\Http\Middleware\VerifyCsrfToken::class,
只需使用 //
禁用此特定代码
太棒了!这会奏效!
这样您就可以从 API 调用中删除中间件(如果您愿意的话......)
绝对 这个方法。
打开 VerifyCsrfToken
class 并定义 $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);
}
}
我有一个 API 通话,有 post 数据;假设这是登录过程。
使用 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 从外部调用时我该如何做?
通常 API 用于跨站点请求。所以你的 CSRF 保护是毫无意义的。
如果您不打算跨站点使用它,那么 API 很可能不是您要执行的操作的最佳解决方案。无论如何,您 可以 创建一个 API 端点,其中 returns 一个令牌。
public function getToken(){
return Response::json(['token'=>csrf_token()]);
}
如果您想禁用某些方法的 CSRF 保护,您可以使用 except
或 only
。
$this->beforeFilter('csrf', array('on' => 'post',
'except'=>array('methodName', 'anotherMethod')
));
听听这个。就在 30 分钟之前,我遇到了同样的问题。现在解决了。试试这个。
转到应用程序 -> HTTP-> 内核
打开内核文件。
在那里你可以看到: \App\Http\Middleware\VerifyCsrfToken::class,
只需使用 //
禁用此特定代码太棒了!这会奏效!
这样您就可以从 API 调用中删除中间件(如果您愿意的话......)
绝对
打开 VerifyCsrfToken
class 并定义 $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);
}
}