我有一个带有发布数据的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删除该行时,一切正常。但这不能成为解决办法。任何开机自检呼叫都会收到此错误消息。我知道我需要这个_token。但是当我从 API 调用时如何获得此令牌?我知道我可以在 Laravel 内部创建令牌,但是当我通过 API 从外部调用时,我该如何执行此操作?
通常 API 用于跨站点请求。所以你的CSRF保护是没有意义的。
如果您不打算跨站点使用它,则 API 可能不是您要执行的操作的最佳解决方案。无论如何,您可以创建一个返回令牌的 API 端点。
public function getToken(){
return Response::json(['token'=>csrf_token()]);
}
如果要在某些方法上禁用CSRF保护,可以使用except
或only
。
$this->beforeFilter('csrf', array('on' => 'post',
'except'=>array('methodName', 'anotherMethod')
));
请参考官方的Laravel文档。
绝对不要使用这种方法。
打开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);
}
}
听听这个。就在30分钟之前,我遇到了同样的问题。现在它解决了。试试这个。
转到应用程序 -> HTTP-> 内核
打开内核文件。
在那里你可以看到: ''App''Http''Middleware''VerifyCsrfToken::class,
只需使用//禁用此特定代码
就是这样!这将起作用!
这样您就可以从 API 调用中删除中间件(如果需要的话......