为 laravel SPA 生成动态 csrf-token

Posted

技术标签:

【中文标题】为 laravel SPA 生成动态 csrf-token【英文标题】:generate dynamic csrf-token for laravel SPA 【发布时间】:2019-01-22 02:36:42 【问题描述】:

我将 laravel 5.6 与 axios 和 vue 一起用于我的 SPA 网络应用程序。 问题是一段时间后 csrf 令牌将过期,因此应该有一个烦人的提示告诉用户刷新不是我要查找的页面。 所以我所知道的关于 laravel 5.6 中 csrf 令牌的所有信息就是它以这种方式在 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');

如何更改它以在每个请求上获取 csrf 令牌?

【问题讨论】:

对这个问题的公认答案似乎是一个不错的实现,您可以采用它来解决您的问题:***.com/questions/31449434/… 【参考方案1】:

为检索最新的 csrf 令牌创建一个端点:

ExampleController.php

public function getCsrf() 
  return response(csrf_token());

路线:(routes/wew.php)

Route::get('csrf', 'ExampleController@getCsrf');

在您的 Javascript 中,您可以请求新的 csrf 令牌并替换您的 axios 实例中的旧令牌。

axios.get('/csrf').then(( data ) => 
  window.axios.defaults.headers.common['X-CSRF-TOKEN'] = data;
)

【讨论】:

这会降低应用程序的安全性吗? CSRF 的目的是通过不将其暴露给外界来生成一个秘密令牌,但是通过这个 API 端点,该目的变得无效!那么对于攻击者来说,这不是一个简单的蛋糕吗?

以上是关于为 laravel SPA 生成动态 csrf-token的主要内容,如果未能解决你的问题,请参考以下文章

生成后在 Nuxt SPA 中使用动态路由

Vue SPA 的 Laravel 电子邮件验证

使用内置的 Laravel 5.2 身份验证并加载 SPA,然后为所有其他路由加载 Dingo API

如果页面仅加载一次,如何在 SPA 中获取 Laravel cookie

Laravel 5.3 中以 API 为中心的应用程序

如何使用 Laravel Sanctum 处理 SPA 和基于令牌的身份验证