情况:
如果已经被问到,请提前抱歉。但无论我怎么做都无法发挥作用。
我使用Laravel 5作为API。
我有一个简单的功能来编辑任务。
我正在通过我的网络应用或Postman进行测试。
我总是收到这个错误:
TokenMismatchException in compiled.php line 3123:
代码:
功能:
public function updateTask(Request $request)
{
$id = $request->input('id');
$task = Task::find($id);
$task->name = $request->input('name');
$task->type = $request->input('type');
$task->save();
return $task;
}
路线:
Route::group(['middleware' => ['web']], function () {
Route::post('update', 'TaskController@updateTask');
});
问题:
为什么我收到错误?
答案 0 :(得分:2)
尝试在表单中添加:
<input type="hidden" name="_token" value="{{ csrf_token() }}">
答案 1 :(得分:1)
它适用于您的网络应用,因为您的网络应用正在传递令牌。
您需要打开app/Http/Kernel.php
并注释掉\App\Http\Middleware\VerifyCsrfToken::class,
。但是,这会使您的网站容易受到CSRF攻击,因此您还应该找到另一种方法来保护您的网站。
我的建议是保留CSRF中间件并创建一个新的路由组,其中包含您选择的前缀(通常类似于api/v1/
),它位于web
中间件组之外。这些路线不会受到CSRF的保护,因此您应该找到另一种方法来保护它们。我最近使用jwt-auth
做了同样的事情,取得了很多成功。 https://github.com/tymondesigns/jwt-auth
当然,如果您的前端没有与后端完全分离,并且Laravel正在输出初始页面,然后稍后由angular控制,您可以将CSRF令牌放入元标记中并稍后使用angular和pass获取它它在标题X-CSRF-TOKEN
中,然后Laravel将接收它。
答案 2 :(得分:0)
您需要在标题中传递此内容;
headers: {
'X-CSRF-TOKEN': {{ csrf_token() }}
},
答案 3 :(得分:0)
我通过将路径名称作为项目插入数组$来解决它,除了在文件中:
app/http/Middleware/VerifyCsrfToken.php
像这样:
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'update'
];
答案 4 :(得分:0)
我解决了:
php artisan config:cache
和
php artisan key:generate