发布到 Nexus 上的私有 NPM 存储库时的身份验证错误

Posted

技术标签:

【中文标题】发布到 Nexus 上的私有 NPM 存储库时的身份验证错误【英文标题】:Authentication error on publishing to private NPM repository on Nexus 【发布时间】:2019-12-08 06:49:12 【问题描述】:

我在发布到我的私有 Nexus 上托管的私有 npm 注册表时遇到身份验证问题。

我的 Nexus 设置是我有 npm-proxynpm-registry(使用 allowRepublish=false 托管 npm)、npm-snapshots(使用 allowRepublish=true 托管 npm)和 npm-public(与所有其他三个存储库组合在一起)。

由于我正在开发一个库,我正在使用我的快照存储库,因此我可以不断地重新部署相同的版本(类似于 maven 世界中的快照)。

在我的库项目中,我在 package.json

中设置了此选项
"publishConfig": 
    "registry": "https://my.nexus.com/repository/npm-snapshots/"

接下来,我创建了 .npmrc 文件,其内容如下:

registry=https://my.nexus.com/repository/npm-public/
_auth=RVhBTVBMRQ==

通过此设置,我可以毫无问题地发布项目。但是,困扰我的是,我的密码(只是 base64 编码)存储在文件中,应该提交,但由于其中的凭据,我无法提交。

我尝试登录到 npm 注册表并从 .npmrc 中删除了 auth 行 npm adduser --registry=https://my.nexus.com/repository/npm-snapshots --always-auth

我收到了回复Logged in as myusername on https://my.nexus.com/repository/npm-snapshots.

但是,当我尝试运行 npm publish 时,我得到:

npm ERR! code E401
npm ERR! Unable to authenticate, need: BASIC realm="Sonatype Nexus Repository Manager"
npm verb exit [ 1, true ]
npm timing npm Completed in 6867ms

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\XXXX\AppData\Roaming\npm-cache\_logs\2019-07-30T19_31_01_598Z-debug.log

现在在我的另一个项目(正在使用这个库)中,我简单地创建了内容为 registry=https://nexus.mjamsek.com/repository/npm-public/ 的 .npmrc 文件并运行命令 npm adduser --registry=https://my.nexus.com/repository/npm-public --always-auth 并且我能够下载已发布的包。

但是,发布仍然无法正常工作,我不知道为什么。

编辑 31.7.2019:在我的活动领域列表中,我还有 npm Bearer Token Realm

【问题讨论】:

您需要在传递给“npm adduser”的注册表 URL 的末尾加上一个斜杠,否则 npm 将切断 URL 的最后一段,并且它不起作用。 确实是问题所在,谢谢。如果你把它写成答案,我会接受它。 【参考方案1】:

我有同样的问题,我的解决方案是删除我的全局 .npmrc 文件,然后登录 npm 登录。

【讨论】:

【参考方案2】:

我也遇到过类似的问题。我还将我们的凭据存储在我的用户目录中的 npmrc 文件中。使用 node16/npm7 设置时,我会收到错误

npm ERR! code ENEEDAUTH
npm ERR! need auth This command requires you to be logged in.
npm ERR! need auth You need to authorize this machine using `npm adduser`

如果我使用 nvm 降级到 node12/npm6,它可以工作。我更喜欢不降级的工作解决方案,但现在它可以让我继续前进。

【讨论】:

有什么更新吗? ://【参考方案3】:

只需在 nexus 仪表板中启用 匿名 访问,它将从您的私人注册表中提取。

【讨论】:

这违背了私有注册表的全部目的【参考方案4】:

我的机器上安装了三个版本的节点。事实证明,我后来安装的那些在 node_modules 文件夹中有自己的本地 .npmrc 文件。即使我删除了本地的,他们也没有使用全局 .npmrc,所以我不得不复制它。

【讨论】:

【参考方案5】:

前两天我一直在为这个问题苦苦挣扎,最后解决方案是从根(用户)目录中删除 .npmrc 文件。 当 npm 尝试登录时,它使用此文件中的凭据并忽略您的密码登录。

【讨论】:

【参考方案6】:

我今天遇到了这个问题,我的解决方案是从我的 npmrc 文件中删除所有注册表项:

registry=https://my.nexus.com/repository/npm-snapshots/

最好删除任何多余的东西,事先备份,在我的情况下,我的文件只包含:

strict-ssl=false

那么你可以 再次npm login --registry=https://my.nexus.com/repository/npm-public/

如果这不起作用,您还可以使用 curl 绕过 npm 登录,查看 this life saving post。

【讨论】:

【参考方案7】:

_auth= 替换为 btoa('username:userpassword') 的输出,它对我有用。

我确实使用了这个来自 chrome 的 btoa,如下所示。

【讨论】:

【参考方案8】:

确保 _auth 令牌正确。就我而言,我更改了系统凭据并忘记生成新的 _auth 令牌。我得到了完全相同的错误,即 "npm ERR! 代码 E401 npm 错误!无法验证,需要:BASIC realm="Sonatype Nexus Repository Manager"

一旦我修复它,问题就解决了。 对于那些正在寻找生成 _auth 的命令的人。它是: btoa('username:userpassword')

【讨论】:

【参考方案9】:

您需要在传递给npm adduser 的注册表 URL 末尾加上一个斜杠,否则npm 将切断 URL 的最后一段,并且它不起作用。

【讨论】:

年度最佳答案! +100000000000000000000000【参考方案10】:

当您执行npm loginnpm adduser 时,NPM 客户端会创建一个身份验证令牌,该令牌将在以后对注册表的请求中使用。默认 NXRM 配置仅允许不识别 NPM 令牌的 Local Authenticating Realm。请确保您已激活 npm Bearer Token Realm

【讨论】:

嗨,我已经在活动领域列表中找到了这个,我更新了问题。

以上是关于发布到 Nexus 上的私有 NPM 存储库时的身份验证错误的主要内容,如果未能解决你的问题,请参考以下文章

npm 安装私有 GitHub 存储库时,GitHub Actions 引发 Git 错误

已启用 npm 注册表 2fa 的 nexus 代理存储库

使用Nexus3构建Docker私有镜像仓库

NEXUS npm install 给出 403 错误

Sonatype Nexus3 搭建私有仓库

使用npm私有源nexus 或者 verdaccio 的方法