【问题标题】:Laravel X-CSRF-Token mismatch with POSTMANLaravel X-CSRF-Token 与 POSTMAN 不匹配
【发布时间】:2015-08-25 17:24:46
【问题描述】:

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

我通过以下方式检索我的令牌:

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

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

【问题讨论】:

    标签: api laravel csrf postman


    【解决方案1】:

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

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

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

    如果尚未安装 Postman Interceptor,请安装,然后打开它

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

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

    X-CSRF-TOKEN        tokenvaluetobeinserted235kwgeiOIulgsk
    

    有些人建议在测试 API 时关闭 CSRF 令牌,但实际上你并不是在测试它。

    如果您发现仍然有错误,请使用 preview 检查回复,因为 Laravel 的错误消息往往相当明确。如果什么都没有回来,请检查您的 php_error.log(它叫什么)。


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

    【讨论】:

    • 如果需要,您可以为 CSRF 编写一个单元测试,对于其他测试,您可以将其关闭...您声称“我想测试一些管理功能 A,但我需要登录所以我在测试功能 A 时也测试了登录功能。不使用每个 post/patch/put 测试 CSRF 是可以的 - 如果您对 CSRF 进行严格的单独单元测试。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • csrf 令牌解决了我的问题。我从 GET 请求中获取它并将其发布在 POST、PUT、DELETE 请求的标头上
    【解决方案3】:

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

    在您的 POST 请求中添加一个标头字段:

    "X-CSRF-TOKEN: "copied_token_in_previous_get_response"
    

    【讨论】:

    • 所以我每次发送请求时都必须这样做。效率不高
    • Aditya,是的,包括 CSRF 保护很不方便,但如果你只能生成一个令牌,它就会破坏 CSRF 令牌的目的。如果您不想使用它们,可以在 VerifyCsrfToken 中间件中禁用它们
    【解决方案4】:

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

    https://&lt;your-site-url&gt;/api

    不是:

    https://&lt;your-site-url&gt;

    【讨论】:

      【解决方案5】:

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

          protected $except = [
              '/api/*'
          ];
      

      【讨论】:

        【解决方案6】:

        将 /api 添加到 url 应该可以解决大多数人刚刚测试他们的 API 的问题......例如。 https://www.yoursite.com/api/register

        【讨论】:

          猜你喜欢
          • 2016-10-09
          • 2022-01-08
          • 2021-11-01
          • 2019-02-27
          • 2021-04-07
          • 2021-05-31
          • 1970-01-01
          • 2020-07-08
          • 2016-12-10
          相关资源
          最近更新 更多