发布到 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-proxy、npm-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 login
或npm adduser
时,NPM 客户端会创建一个身份验证令牌,该令牌将在以后对注册表的请求中使用。默认 NXRM 配置仅允许不识别 NPM 令牌的 Local Authenticating Realm。请确保您已激活 npm Bearer Token Realm。
【讨论】:
嗨,我已经在活动领域列表中找到了这个,我更新了问题。以上是关于发布到 Nexus 上的私有 NPM 存储库时的身份验证错误的主要内容,如果未能解决你的问题,请参考以下文章