您将 CSRF 令牌放在 Relay/GraphQL 中的啥位置?

Posted

技术标签:

【中文标题】您将 CSRF 令牌放在 Relay/GraphQL 中的啥位置?【英文标题】:Where do you put the CSRF token in Relay/GraphQL?您将 CSRF 令牌放在 Relay/GraphQL 中的什么位置? 【发布时间】:2015-12-13 14:52:50 【问题描述】:

我正在尝试使用我的 Laravel 服务器设置 Relay 和 GraphQL。我已成功设置 Laravel 以服务 GraphQL。

过去,为了使用 jQuery 进行 ajax 调用,我在 master.blade.php 中添加了以下内容:

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

以下内容添加到我的 main.js 文件中:

$.ajaxSetup(
    headers: 
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    
);

我的 GraphQL 端点当前正在返回令牌不匹配异常。在我看来,Relay 需要以与 jQuery.ajax 类似的方式将 csrf-token 传递给服务器。去哪儿了?

【问题讨论】:

你是如何将 Relay 与 graphql-laravel 一起使用的?我认为它需要与 Relay 兼容。打开一个问题github.com/Folkloreatelier/laravel-graphql/issues/9 【参考方案1】:

配置您的网络层以将标头附加到每个请求:

Relay.injectNetworkLayer(
  new Relay.DefaultNetworkLayer('/graphql', 
    headers: 
      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
    ,
  )
);

Relay.DefaultNetworkLayer 的第二个参数被传递给fetch(input, init)init 参数。请参阅Relay Network Layer Guide 了解更多信息。

【讨论】:

谢谢!太简单!我一直在想我需要在没有 jQuery 的情况下获取 dom attr('content')。 如果你根本不想使用jQuery,你可以使用document.querySelector('meta[name="csrf-token"]').getAttribute('content')获取token

以上是关于您将 CSRF 令牌放在 Relay/GraphQL 中的啥位置?的主要内容,如果未能解决你的问题,请参考以下文章

何时需要使用令牌保护表单(CSRF 攻击)?

反 CSRF 令牌和 Javascript

CSRF:我可以使用 cookie 吗?

快速 CSRF 令牌验证

在测试中获取 CSRF 令牌,“CSRF 令牌无效” - 功能性 ajax 测试

api 端点未在 Sanctum 上进行 CSRF 令牌验证 - CSRF 令牌不匹配