上传到 Zeit/Now 时在客户端中暴露的 Nuxt 环境变量
Nuxt environment variables exposed in client when uploaded to Zeit/Now
我正在使用 Zeit/Now 部署一个 Nuxt 应用程序。在开发阶段,我使用 .env
文件将机密存储到我的 Contentful CMS,并使用 nuxt-dotenv 包将机密公开给 process.env
。为此,我在 nuxt.config 的顶部调用了 require('dotenv').config()
。
然后我用 Zeit/Now 存储了秘密并创建了一个 now.json 来为构建和运行时设置它们,如下所示:
{
"env": {
"DEMO_ID": "@demo_id"
},
"build": {
"env": {
"DEMO_ID": "@demo_id"
}
}
}
使用该设置,构建仅适用于索引页面,所有 Javascript 都不起作用。只有当我将 env-属性 添加到 nuxt.config.js
文件时,该应用程序才开始在 Zeit-server 上正常运行。
require('dotenv').config()
export default {
...
env: {
DEMO_ID: process.env.DEMO_ID
},
...
modules: [
'@nuxtjs/dotenv'
],
...
}
但是:当我检查上传的 Javascript 文件时,我的秘密被暴露了,这显然是我不希望的。
我在这里做错了什么?感谢您的帮助。
你不一定在这里做错了什么,这就是 Nuxtjs 的工作方式。
在env
属性中声明的变量用于替换process.env.MY_ENV
的实例,但是因为Nuxt是同构的,所以这既可以在服务器上也可以客户.
如果您希望这些秘密只能在服务器上访问,那么解决这个问题的最简单方法是使用 serverMiddleware
.
As serverMiddleware is decoupled from the main Nuxt build, env variables defined in nuxt.config.js are not available there.
这意味着您的普通 ENV 变量应该可以访问,因为服务器中间件 运行 在节点上。
显然,这意味着这些秘密在客户端不可用,但如果您有类似 Stripe 秘密密钥的东西,您需要使用它来发出后端请求,这就有效。
我们在项目中遇到了类似的问题。甚至,我们从头开始创建一个nuxt项目,检查一下是否有我们跳过的情况。我们注意到,在构建 nuxt 时,它会将 .env 变量复制到 nuxt 文件夹中的 utils.js 中。通过文档here,我们将nuxt.config.js中的模块部分修改如下,
modules: ['@ nuxtjs / apollo', '@ nuxtjs / axios', ['@ nuxtjs / dotenv', { only: ['']}]],
然后我们注意到 .env 变量没有暴露。
希望对您有所帮助。
我们的 nuxt 版本是 "nuxt": "^ 2.13.0".
此外,关于 here 的一些讨论。
我正在使用 Zeit/Now 部署一个 Nuxt 应用程序。在开发阶段,我使用 .env
文件将机密存储到我的 Contentful CMS,并使用 nuxt-dotenv 包将机密公开给 process.env
。为此,我在 nuxt.config 的顶部调用了 require('dotenv').config()
。
然后我用 Zeit/Now 存储了秘密并创建了一个 now.json 来为构建和运行时设置它们,如下所示:
{
"env": {
"DEMO_ID": "@demo_id"
},
"build": {
"env": {
"DEMO_ID": "@demo_id"
}
}
}
使用该设置,构建仅适用于索引页面,所有 Javascript 都不起作用。只有当我将 env-属性 添加到 nuxt.config.js
文件时,该应用程序才开始在 Zeit-server 上正常运行。
require('dotenv').config()
export default {
...
env: {
DEMO_ID: process.env.DEMO_ID
},
...
modules: [
'@nuxtjs/dotenv'
],
...
}
但是:当我检查上传的 Javascript 文件时,我的秘密被暴露了,这显然是我不希望的。
我在这里做错了什么?感谢您的帮助。
你不一定在这里做错了什么,这就是 Nuxtjs 的工作方式。
在env
属性中声明的变量用于替换process.env.MY_ENV
的实例,但是因为Nuxt是同构的,所以这既可以在服务器上也可以客户.
如果您希望这些秘密只能在服务器上访问,那么解决这个问题的最简单方法是使用 serverMiddleware
.
As serverMiddleware is decoupled from the main Nuxt build, env variables defined in nuxt.config.js are not available there.
这意味着您的普通 ENV 变量应该可以访问,因为服务器中间件 运行 在节点上。
显然,这意味着这些秘密在客户端不可用,但如果您有类似 Stripe 秘密密钥的东西,您需要使用它来发出后端请求,这就有效。
我们在项目中遇到了类似的问题。甚至,我们从头开始创建一个nuxt项目,检查一下是否有我们跳过的情况。我们注意到,在构建 nuxt 时,它会将 .env 变量复制到 nuxt 文件夹中的 utils.js 中。通过文档here,我们将nuxt.config.js中的模块部分修改如下,
modules: ['@ nuxtjs / apollo', '@ nuxtjs / axios', ['@ nuxtjs / dotenv', { only: ['']}]],
然后我们注意到 .env 变量没有暴露。
希望对您有所帮助。
我们的 nuxt 版本是 "nuxt": "^ 2.13.0".
此外,关于 here 的一些讨论。