我尝试与使用Laravel构建的REST API通信。但由于令牌不匹配,使用POSTMAN的调用被拒绝。我想我需要在标头中包含CSRF令牌。但我是否需要加密的令牌?当我插入此令牌时,我仍然收到令牌不匹配的错误。
我使用以下方法检索令牌:
$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
return $encrypted_token;
但这是否应该在每次刷新时更改?
8条答案
按热度按时间j13ufse21#
如果您不使用表单(例如,对于API),您可以按照以下步骤操作https://gist.github.com/ethanstenis/3cc78c1d097680ac7ef0:
基本上,添加以下到您的刀片或树枝头
安装Postman Interceptor(如果尚未安装),并将其打开
然后,在浏览器中登录到站点(您需要获得授权),并检查元素或查看源代码以检索令牌
在Postman中,根据需要设置GET/POST等,并在头中创建一个新的对
有些人建议在测试API时关闭CSRF令牌,但这样做并不是真正在测试它。
如果你发现你仍然有错误,使用
preview
检查返回的响应,因为Laravel的错误信息往往相当明确。如果什么都没有返回,检查你的php_error.log
(不管它叫什么)。ps 2018年10月-我现在使用Laravel Passport来处理API注册、登录和用户令牌-值得一看!
l5tcr1uw2#
转到
app/Http/Middleware/VerifyCsrfToken.php
并添加以下值z9smfwbn3#
是的,每次刷新它都会改变。你应该把它放在视图中,当你发布它的时候,它需要作为“_token”POST变量的值发送。
如果您只是使用标准POST,只需将以下内容添加到表单中:
如果您使用 AJAX ,请确保获取_token的值并将其与请求一起传递。
参考:http://laravel.com/docs/5.1/routing#csrf-protection
4ktjp1zp4#
使用 Postman
向任何具有
<meta name="csrf-token" content="{{ csrf_token() }}">
从响应中复制值。
将标头字段添加到POST请求:
yws3nbqq5#
我在我的Postman环境中使用
baseURL
变量时遇到了这个错误。原来我调用的网站URL末尾没有/api
。听起来很傻,但为了避免用户错误,请确保您的请求URL基于:https://<your-site-url>/api
非:
https://<your-site-url>
oogrdqng6#
如果您正在使用
REST API
,则根据Laravel文档,使用api.php
写入路由,而不是web.php
,web.php
用于为网站写入路由,这就是您在像API一样使用它时看到csrf-token错误的原因,因此对于API,我们有api.php
文件,该文件不会给予您csrf-token错误。bz4sfanl7#
我刚刚遇到了同样的问题,这个答案最终帮助我解决了这个问题:https://stackoverflow.com/a/67435592/11854580
很明显,CSRF令牌需要在每次POST请求时更新(而不是每次GET请求时)。您可以使用Postman中的pre-request-script来解决这个问题,如本教程所述:https://blog.codecourse.com/laravel-sanctum-airlock-with-postman/
k4ymrczo8#
在url中添加/api可以解决大多数人的问题,比如https://www.yoursite.com/api/register