Laravel X-CSRF-Token与POSTMAN不匹配

ses*_*360 13 api csrf laravel postman

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

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

$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
return $encrypted_token;
Run Code Online (Sandbox Code Playgroud)

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

DEV*_*nça 19

转到app/Http/Middleware/VerifyCsrfToken.php并添加此值

    protected $except = [
        '/api/*'
    ];
Run Code Online (Sandbox Code Playgroud)

  • 如果您解释这将禁用 csrf 令牌验证,将会很有用。提供解决方案不足以在 stackoverflow 上回答,您需要解释您正在做什么。这是一个误导性的答案。 (7认同)

bri*_*itt 13

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

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

<meta name="csrf-token" content="{{ csrf_token() }}">
Run Code Online (Sandbox Code Playgroud)

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

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

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

X-CSRF-TOKEN        tokenvaluetobeinserted235kwgeiOIulgsk
Run Code Online (Sandbox Code Playgroud)

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

如果您确实发现仍然有错误,请使用previewLaravel 检查响应,因为Laravel往往会明确显示错误消息.如果什么都没有回来,检查你的php_error.log(它叫什么).


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

  • 如果需要,您可以为 CSRF 编写一个单元测试,而对于其他测试,您可以将其关闭...您声称“我想测试一些管理功能 A,但我需要登录,所以我还测试登录功能”当我测试功能 A 时”。如果您严格针对 CSRF 进行单独的单元测试,则不在每个帖子/补丁/放置中都测试 CSRF 是可以的。 (2认同)

Jam*_*ing 7

我在使用时遇到了这个错误baseURL我在 Postman 环境中结果我调用的网站网址没有/api结尾。听起来很愚蠢,但为了消除用户错误,请确保检查您的请求 URL 是否基于:

\n\n

\xe2\x9c\x85https://<your-site-url>/api

\n\n

不是:

\n\n

\xe2\x9d\x8chttps://<your-site-url>

\n


Jam*_*lor 6

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

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

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

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

向您的 POST 请求添加标头字段:

"X-CSRF-TOKEN: "copied_token_in_previous_get_response"
Run Code Online (Sandbox Code Playgroud)