在 .npmrc 中使用身份验证令牌

Anc*_*nek 29 environment-variables npm font-awesome

我有一个项目,我们使用 font awesome 5 库。我按照此处编写的说明操作,并添加了一个.npmrc带有我的身份验证令牌的文件。

将其放入回购中是一种安全的行为吗?我希望开发人员可以访问它,但是如果 repo 公开,我们可能会暴露令牌。

在这种情况下,最佳做法是什么?

Bri*_*lip 41

更新 2021-05-02

这个答案仍然有问题 - 请参阅下面的评论。我再也无法访问私人($paid)npm 帐户,因此我无法再通过测试来回答问题。

也许试试@konyak 的回答。


绝对不是一个安全的行为放在任何混帐令牌检查文件,包括.npmrc。

以下是您的团队可以采取的安全利用 npm 令牌的步骤。

有两种不同的环境需要考虑:

  1. 每个开发人员的本地开发机器
  2. 应用的部署平台

本地开发

按照您在问题中链接的全局设置说明,不是解决方案。

创建类似于“每个项目”说明的 .npmrc 文件,但将您的真实令牌替换为变量名,前缀为$。IE:

@fontawesome:registry=https://npm.fontawesome.com/
//npm.fontawesome.com/:_authToken=$TOKEN
Run Code Online (Sandbox Code Playgroud)

npm 将检测一个名为.env. 因此,在.gitignored .env 文件中,添加您的密钥值对,即:

TOKEN=ABC123
Run Code Online (Sandbox Code Playgroud)

根据npm-config文档,您还可以使用“NPM_CONFIG_”作为变量名称的前缀,即:

NPM_CONFIG_TOKEN=ABC123
Run Code Online (Sandbox Code Playgroud)

现在,当 dev 运行时npm i,字体很棒的依赖项将从私有仓库加载。

注意:不要遵循当前关于环境变量语法的 npm-config 文档!请参阅此堆栈溢出答案,即:

 BAD npm-config ENVIRONMENT VAR SYNTAX 

${TOKEN}
Run Code Online (Sandbox Code Playgroud)
 GOOD npm-config ENVIRONMENT VAR SYNTAX 

$TOKEN
Run Code Online (Sandbox Code Playgroud)

应用部署平台

执行上面本地开发部分中的所有步骤,加上:

  • 在平台上创建一个与 .npmrc 文件同名的环境变量。

如果您的应用程序主机是 Netlify,请参阅他们的构建环境变量文档

  • npm install 从 .env 读取的记录在哪里?该解决方案对我不起作用,未检测到环境变量。 (8认同)
  • 您链接到的关于为什么“$TOKEN”比“${TOKEN}”更可取的答案已被删除(而且,从未解释*为什么*“$TOKEN”应该优先,只是说它应该)。您能否详细说明一下:为什么“$TOKEN”比“${TOKEN}”更好?如果一个适用于您,而另一个则不适用,那么您使用的是哪种操作系统? (7认同)
  • 保存到“.env”文件对我来说不起作用。必须导出到我的会话 (5认同)
  • 在 .npmrc 中,不需要“$” (3认同)
  • 关于扩展的答案不正确 `$TOKEN` 和 `${TOKEN}` 就扩展的内容而言是相同的。引用 bash 手册 `'$' 字符引入了参数扩展、命令替换或算术扩展。要扩展的参数名称或符号可以用大括号括起来,这是可选的(lmk,如果你希望我链接到 zsh 手册,说同样的话:D) (3认同)
  • 使用 .env 文件对我来说也不起作用。不知怎的,变量替换似乎没有获取 .env 文件中定义的内容。有没有办法告诉 npm 读取 .env 文件?使用 $TOKEN 只会失败并出现授权错误,而使用 ${TOKEN} 会失败并出现错误“无法替换配置中的 env:${TOKEN}”。(注意:将令牌直接放在 .npmrc 文件中就可以了,因此令牌本身是有效的) (3认同)
  • 如何防止“npm login”将您的身份验证令牌放回原处? (2认同)
  • 在本地,我可以使用`TOKEN`或`$TOKEN`,两者都有效,但是`${TOKEN}`失败!但在 GitHub CI 和 Heroku 上它必须是 `${TOKEN}`!!!否则我会收到`请求失败\"401未经授权\"` (2认同)

kon*_*yak 26

https://docs.npmjs.com/using-private-packages-in-a-ci-cd-workflow

将您的秘密令牌导出到您的会话中,例如, export NPM_TOKEN="00000000-0000-0000-0000-000000000000"

在你的里面~/.npmrc,添加//registry.npmjs.org/:_authToken=${NPM_TOKEN}

  • 这就是我过去 4 个小时一直在寻找的答案!我不知道我发现的所有其他答案是否都适用于 Win 和 Mac,但这实际上是唯一适用于 Linux 的解决方案!谢谢你!(我只能投票1次..这需要更多投票!) (2认同)
  • 是否有原因导致 `:_authToken=` 不起作用并且我必须将其作为 `_auth=` 放在单独的行上?是否有某种语法变化或其他什么? (2认同)