【问题标题】:Send headers with Vue-Router使用 Vue-Router 发送标头
【发布时间】:2023-04-09 23:51:01
【问题描述】:

我已经在互联网上搜索了一段时间,甚至在这里检查了所有建议的问题,但我一无所获。

基本上,我使用 vue-router 在用户单击视图时加载视图(没有预取,只是延迟加载),使用导入 Vue 视图/组件的函数。为了更好地形象化,我做了一个简单的例子来说明我在做什么:

const router = new VueRouter({
  routes: [
    ...
    {
      path: "/a_page",
      component: function() {
        return import("./views/A_Page.vue");
      }
    }
  ]
});

我在后端使用 Express 来保护某些路由,因为在前端保护它是浪费精力,因为用户可以轻松绕过“保护”,如果他愿意的话。此外,所有视图都有自己的拆分 .js 文件(使用 "webpackChunkName"),并且 Express 需要为每个请求的 API 调用 OR .js 文件提供承载身份验证令牌标头。这适用于 Axios(负责获取 API 数据),您可以手动定义标头,但 vue-router 没有此选项,并且由于它不发送 Authorization 标头,因此不会进行身份验证,Express 会阻止带有 403 的文件并且 vue-router 无法导入该文件。

有什么方法可以将 Authorization 标头与导入一起发送(基本上只是一个 GET 请求)?

提前致谢。


如果有人认为我以错误的方式处理问题,请随时发表评论并提出其他建议。


编辑:建议的重复问题没有得到足够的关注,并且给出的唯一解决方案(基本上分为 2)不再适用于当前的 webpack; onload(event) 和 onerror(event) 未定义。

【问题讨论】:

  • 您的 Express 视图是否嵌入了您想要保护的数据,或者它只是一个组件,然后从 API 请求数据?如果您真的想保护您的客户端代码,请参阅stackoverflow.com/q/49731460/2486583
  • @JamesIrwin 我不确定我是否理解正确。 Express 处理 API 和文件。所有 API 调用都对“/api/....”进行,所有文件都加载请求“/....”。 API 调用返回 JSON,文件主要是 .js 文件,其中包含 Vue 视图,然后通过 Axios 请求 API,然后填充实际数据。
  • 我的想法是,如果组件不包含数据,为什么要保护组件。每个人都可以访问 Js 文件。当这些Js被加载时,它们会调用api,然后如果你没有通过身份验证或者你没有正确的权限,你会收到一个错误401或403
  • @Sodala 但是 Vue 视图即使它不包含 实际 数据,也会加载整个结构,并且攻击者(或有点过于好奇的人)可能会欺骗路由进入加载然后分析整个页面:我们有什么,我们如何排序,我们考虑什么等等。这不是我真正想要展示的东西。

标签: javascript express vue.js axios


【解决方案1】:

您可以使用路由器防护而不是使用基本身份验证。

我使用这种方法,以及延迟加载的路由。如果身份验证失败,您可以将用户重定向到登录页面。

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
    If (auth) { // get value of cookie etc for a jwt token or similar auth method
        next() // proceed
   }
   else {
        next(false) // cancel navigation
        // or
        next(“/login-url”) // redirect you login url
    }
})

此外,您可以使用 axios 方法对每次路由更改进行身份验证。

【讨论】:

  • 但这在前端,可以绕过。即使使用延迟加载,路由本身也不受保护,可能会被欺骗加载。
  • 您不需要过多地保护前端,只要确保用户不会去他们不应该去的地方就足够了。真正的安全应该在您的后端,以确保未经授权的任何人都无法访问他们不应该访问的任何数据。
【解决方案2】:

如果您想发送 Authorization 标头(这似乎不是一件容易的事,因为没有人知道如何去做...)我认为您可以覆盖 webpack 的 jsonp 函数,它用于在 splitChunks 中加载块...

Here's the docs for the webpack function that loads the chunks

您将使用修改后的块加载函数覆盖您的 webpack 配置,然后将其绑定到您的 vue.config.js 中,就像这样...

// vue.config.js

module.exports = {
    configureWebpack: require('./webpack.config.js')
}

话虽如此,我建议在您需要加载拆分块并且不需要授权标头为您的静态资产提供服务时更早地保护您的前端资产。

有时您可以在网络层(负载平衡器等)执行此操作,具体取决于您的用例。其他时候使用基于服务器的方法,例如使用 Nuxt 渲染您的应用,将是您想要的。

【讨论】:

  • 我已经以多种不同的方式解决了这个问题,但无论我怎么看,都不是可行的(使用 Vue)。页面本身包含字段甚至 i18n 字符串,其中包含有关如何制作/排序/等的潜在敏感信息。这不是我希望 www 看到的东西。有人调查它的机会很低,但存在。一个“解决方案”是将所有字符串都放在 API 中,但随后一切都会变得过于碎片化,我需要从 API 加载每个字段和字面意思的所有内容,这不是完全计划(或快速/优化)。
  • 对于任何研究同样问题的人,我个人现在正在尝试 Nuxt,因为它(应该)在服务器端呈现所有内容并且只提供完全组装的页面。我正在制作一个“中间件”来检查身份验证 - 让我们看看这是怎么回事。
  • Nuxt 是一个很好的工具。他们的auth 选项可能是您想要的。
  • 我找到了我想要的“serverMiddleware”……太伤心了,所以自动给出了错误的问题。不过谢谢!
  • 啊,我很高兴听到我的回答对你有所帮助 :-) 是的,serverMiddleware 会让你把你的 webapp 放在“后面”一些东西。
【解决方案3】:

如果我理解正确(请随时纠正我),您能否在实际路由之前使用 axios 进行身份验证调用,或者在使用挂载调用进行路由时进行身份验证调用?特别是如果没有有效的身份验证,您可以重定向到登录页面或重新路由到错误页面。

如果我有任何误解,请随时告诉我。

【讨论】:

  • 你可以在导航守卫中使用 axios,是的。
  • 但是 webpack 应该首先发送 Authentication 头。据我所知,这只能通过利用 webpack 并在如何加载/导入脚本方面弄乱其核心功能来完成。
  • [继续上面的评论] 理想情况下还需要访问 Vuex 存储来检索 Bearer 令牌字符串...
猜你喜欢
  • 2017-12-04
  • 2021-11-01
  • 2018-03-17
  • 2014-09-20
  • 2018-12-22
  • 2017-09-05
  • 2012-01-09
  • 2016-06-17
  • 1970-01-01
相关资源
最近更新 更多