Vue 组件中的 Laravel CSRF 字段

Posted

技术标签:

【中文标题】Vue 组件中的 Laravel CSRF 字段【英文标题】:Laravel CSRF Field in Vue Component 【发布时间】:2017-12-15 23:56:59 【问题描述】:

我想问如何在我的 vue 组件中添加 csrf_field()。错误是

属性或方法“csrfToken”未在实例上定义,但在渲染期间被引用。确保在 data 选项中声明响应式数据属性。

代码如下:

<script>
export default 
  name: 'create',
  data: function()
    return 
        msg: ''
    
  ,
  props:['test']

</script>
<template>
  <div id="app">
    <form action="#" method="POST">
      csrfToken()
      <div class="form-group">
        <label for="name">Name</label>
        <input type="text" id="name" class="form-control"> 
      </div>
      <div class="form-group">
        <label for="location">Location</label>
        <input type="text" id="location" class="form-control"> 
      </div>
      <div class="form-group">
        <label for="age">Age</label>
        <input type="number" id="age" class="form-control"> 
      </div>
      <div class="form-group">
        <input type="submit" class="btn btn-default"> 
      </div>
    </form>
  </div>
</template>

【问题讨论】:

这个问题似乎是***.com/questions/39938284/…的克隆 【参考方案1】:

正如我已经写过here,我只是建议把它放在你的php文件中:

<script>
    window.Laravel = <?php echo json_encode(['csrfToken' => csrf_token()]); ?>
</script>

这样您就可以轻松地从 JS 部分(在本例中为 Vue)导入您的 csrfToken。

此外,如果您在 PHP 布局文件中插入此代码,您可以在应用程序的任何组件中使用该令牌,因为 window 是一个 JS 全局变量。

来源:我从this 帖子中得到了诀窍。

【讨论】:

【参考方案2】:

Laravel 5 或更高版本

首先,您需要将 CSRF 令牌 存储在标题中的 html 元标记中:

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

然后你可以将它添加到你的脚本中:

<script>
export default 
  name: 'create',
  data: function()
    return 
        msg: '',
        csrf: document.head.querySelector('meta[name="csrf-token"]').content
    
  ,
  props:['test']

</script>

在模板中:

<template>
  <div id="app">
    <form action="#" method="POST">
      <div class="form-group">
        <label for="name">Name</label>
        <input type="text" id="name" class="form-control"> 
      </div>
      <div class="form-group">
        <label for="location">Location</label>
        <input type="text" id="location" class="form-control"> 
      </div>
      <div class="form-group">
        <label for="age">Age</label>
        <input type="number" id="age" class="form-control"> 
      </div>
      <div class="form-group">
        <input type="submit" class="btn btn-default"> 
      </div>
      <input type="hidden" name="_token" :value="csrf">
    </form>
  </div>
</template>

【讨论】:

【参考方案3】:

试试这个:

<script>
export default 
  name: 'create',
  data: function()
    return 
        msg: '',
        csrf: window.Laravel.csrfToken
    
  ,
  props:['test']

</script>

在你的标记中使用

&lt;input type="hidden" name="_token" :value="csrf" /&gt;

编辑

有点像兔子洞,但 Vue 的一大特点是它可以使用 AJAX 和 vue-resource 扩展轻松处理 POST、PATCH 等请求。您可以使用 Vue 组件处理这些数据,而不是在这里使用 &lt;form&gt;。如果您要采用此路线,则可以设置默认标头以随每个请求发送,无论它是什么方法,因此您始终可以发送您的 CSRF 令牌。

exports deafult
 http: 
  headers: 
   'X-CSRF-TOKEN': window.Laravel.csrfToken
  
 

【讨论】:

【参考方案4】:

如果您查看/resources/assets/js/bootstrap.js,您会发现这些行

let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) 
   window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
  else 
  console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
 

我相信您正在使用 axios 来处理您的请求。这意味着您需要添加

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

在您的&lt;head&gt; 标签中。

【讨论】:

【参考方案5】:

在 vue v-for 循环中构建多个表单时遇到了这个问题。

添加到数据中;

csrf: document.head.querySelector('meta[name="csrf-token"]').content,

添加了隐藏的表单元素

<input type="hidden" name="_token" :value="csrf" /> 

【讨论】:

【参考方案6】:

我认为你需要这样写:

 crsf_token() 

不是这样的:

 csrfToken() 

如果这不起作用,也许试试这个:

!! csrf_token !!

【讨论】:

以上是关于Vue 组件中的 Laravel CSRF 字段的主要内容,如果未能解决你的问题,请参考以下文章

带有 axios 和 vue 的 laravel 5.8 中的 CSRF

如何在 vue 模板中引用 laravel csrf 字段

Vue Router Laravel 5.3 Vue 2 JS 上的 CSRF 令牌复制

Vue 无法从 laravel 刀片获取 CSRF 令牌

如何使用 AJAX 请求 Laravel + Vue.js 传递 CSRF 令牌

如何在 vuejs 组件中使用 laravel csrf 令牌