Laravel X-CSRF-Token与POSTMAN不匹配

时间:2015-06-10 12:41:59

标签: api laravel csrf postman

我尝试与使用Laravel构建的REST API交谈。但由于令牌不匹配,POSTMAN的调用被拒绝。我想我需要在标题中包含CSRF令牌。但我需要加密吗?当我插入此令牌时,我仍然会收到令牌不匹配的错误。

我使用以下方法检索我的令牌:

$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
return $encrypted_token;

但这应该在每次刷新时改变吗?

4 个答案:

答案 0 :(得分:10)

如果您没有使用表单 - 例如API - 您可以按照此处的步骤https://gist.github.com/ethanstenis/3cc78c1d097680ac7ef0进行操作:

基本上,将以下内容添加到刀片或树枝标题

<meta name="csrf-token" content="{{ csrf_token() }}">

安装Postman拦截器(如果尚未安装),并将其打开

然后,在您的浏览器中登录该站点(您需要获得授权),并检查元素或查看源以检索令牌

在Postman中,根据需要设置GET / POST等,并在标题中创建一个新对

X-CSRF-TOKEN        tokenvaluetobeinserted235kwgeiOIulgsk

有些人建议在测试API时关闭CSRF令牌,但是你真的没有测试过它。

如果您确实发现仍有错误,请使用preview检查回复,因为Laravel往往会明确显示错误消息。如果没有任何回复,请检查您的php_error.log(无论它叫什么)。

ps 2018年10月 - 我现在使用Laravel Passport处理API注册,登录和用户令牌 - 值得一看!

答案 1 :(得分:4)

是的,每次刷新都会改变。您应该将它放在视图中,当您发布它时,需要将其作为“_token”POST变量的值发送。

如果您只是使用标准POST,只需将其添加到表单中:

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

如果您使用的是AJAX,请确保获取_token的值并将其与请求一起传递。

参考:http://laravel.com/docs/5.1/routing#csrf-protection

答案 2 :(得分:4)

在Postman环境中使用baseURL变量时出现此错误。原来,我在呼叫该站点的URL,但末尾没有/api。听起来很傻,但是只是为了消除用户错误,请确保您检查请求的URL是否基于:

https://<your-site-url>/api

否:

https://<your-site-url>

答案 3 :(得分:0)

使用邮递员  向具有
的任何页面发出GET请求  <meta name="csrf-token" content="{{ csrf_token() }}">
复制响应中的值。

在POST请求中添加标题字段:

"X-CSRF-TOKEN: "copied_token_in_previous_get_response"