我尝试与使用Laravel构建的REST API交谈。但由于令牌不匹配,POSTMAN的调用被拒绝。我想我需要在标题中包含CSRF令牌。但我需要加密吗?当我插入此令牌时,我仍然会收到令牌不匹配的错误。
我使用以下方法检索我的令牌:
$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
return $encrypted_token;
但这应该在每次刷新时改变吗?
答案 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的值并将其与请求一起传递。
答案 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"