使用Nexus https npm注册表代理时,如何在.npmrc中设置_auth?

时间:2016-01-27 16:43:31

标签: npm nexus npm-install

上下文

  1. 我的.npmrc文件似乎已被正确读取(从命令行和Maven构建中使用npm config ls -l进行检查)。

  2. 运行npm的计算机无法直接连接到网络,它只能连接到Nexus npm注册表网址。因此,未设置代理属性proxyhttps-proxy

  3. 由于对Nexus的访问受到限制,我已在Nexus中生成了访问令牌。

  4. Nexus安全令牌由用户名和密码组成,两者都包含/等字符,通常必须是" url编码"

  5. 正如预期的那样,使用此配置时,运行时npm install检测不到代理。

  6. Nexus npm注册表代理似乎已正确设置(我可以访问json文件并使用生成的令牌连接后使用Web浏览器下载tgz文件。

  7. 如果我将registry设置为http://registry.npmjs.org/并评论_authemailalways-authstrict-ssl属性,并添加{ {1}}和proxy配置,https-proxy按预期工作(但我无法在目标环境中执行此操作)

  8. npm install档案

    的内容
    .npmrc

    问题

    我应该如何正确生成; Nexus proxy registry pointing to http://registry.npmjs.org/ registry = https://<host>/nexus/content/repositories/npmjs-registry/ ; base64 encoded authentication token _auth = <see question below> ; required by Nexus email = <valid email> ; force auth to be used for GET requests always-auth = true ; we don't want to put certificates in .npmrc strict-ssl = false loglevel = silly 属性,以使_auth按预期工作?

    我到目前为止尝试了

    1. base64Encode(npm install
      • 结果为<username>:<password>
    2. base64Encode(用urlencode(npm info retry will retry, error on last attempt: Error: socket hang up))
      • 结果为<username>:<password>
    3. base64Encode(用urlencode(npm info retry will retry, error on last attempt: Error: This request requires auth credentials. Run `npm login` and repeat the request.<username>进行urlencode(:))
      • 结果为<password>
    4. 获取npm info retry will retry, error on last attempt: Error: socket hang up错误时,我有以下堆栈跟踪:

      socket hang up

      获取http request GET https://<host>/nexus/content/repositories/npmjs-registry/fsevents sill fetchPackageMetaData Error: socket hang up sill fetchPackageMetaData at TLSSocket.onHangUp (_tls_wrap.js:1035:19) sill fetchPackageMetaData at TLSSocket.g (events.js:260:16) sill fetchPackageMetaData at emitNone (events.js:72:20) sill fetchPackageMetaData at TLSSocket.emit (events.js:166:7) sill fetchPackageMetaData at endReadableNT (_stream_readable.js:905:12) sill fetchPackageMetaData at doNTCallback2 (node.js:441:9) sill fetchPackageMetaData at process._tickCallback (node.js:355:17) sill fetchPackageMetaData error for fsevents@^1.0.0 { [Error: socket hang up] code: 'ECONNRESET' } WARN install Couldn't install optional dependency: socket hang up verb install Error: socket hang up verb install at TLSSocket.onHangUp (_tls_wrap.js:1035:19) verb install at TLSSocket.g (events.js:260:16) verb install at emitNone (events.js:72:20) verb install at TLSSocket.emit (events.js:166:7) verb install at endReadableNT (_stream_readable.js:905:12) verb install at doNTCallback2 (node.js:441:9) verb install at process._tickCallback (node.js:355:17) 错误时,我有以下堆栈跟踪:

      This request requires auth credentials

      提前致谢。

6 个答案:

答案 0 :(得分:21)

答案 1 :(得分:4)

在查看registry-client代码后,我找到了答案,就在这里。我发布它可能会帮助其他人:

base64Encode(<username>:<password>)

顺便说一下,有一个URL编码,但它是authify.js来处理它。

我遇到的“套接字挂断”问题是由于如果在Windows配置中设置代理,从CLI(而不是从Maven构建)启动npm时,所有``` .npmrc``代理设置似乎被忽略,而本机代理排除(对于公司URL)被npm忽略。我会打开一张机票报告这种奇怪的行为。

答案 2 :(得分:2)

如果您具有授权令牌,则不应使用username:password。 我建议你:

  1. 生成令牌

    • 删除〜/ .npmrc或重命名。
    • 确保未设置$ NPM_CONFIG_ *之类的环境设置。
    • 使用以下方法验证电子邮件和其他设置是否未设置:npm config list
    • 使用npm login --registry=https://nexus.whatever.registry/respository/npm-whatever-group/
    • 登录npm
    • 登录后-已登录。 npm应该在〜/ .npmrc中为其生成一个令牌。它看起来像:

//nexus.whatever.registry/respository/npm-whatever-group/:_authToken=NpmToken.YOUR-LOVELY-TOKEN-IN-HEX

  1. 您可以在项目,CI管道和其他项目中使用该令牌。确保在您的项目.npmrc中有:

//nexus.whatever.registry/respository/npm-whatever-group/:_authToken=NpmToken.YOUR-LOVELY-TOKEN-IN-HEX email = <EMAIL_USED_FOR_TOKEN_GENERATION> always-auth = true registry = https://nexus.whatever.registry/respository/npm-whatever-group/

  1. 如果您在身份验证/证书方面遇到问题:

    • 添加env变量(也添加到您的CI / CD pipline) $ NODE_EXTRA_CA_CERTS指向/home/wherever/is/your/cert.pem
  2. 对于CI / CD管道(例如gitlabs或jenikins):

    • 考虑用${RELEVANT_ENV_VARIABLES}替换.npmrc项目文件中的实际值。这样,您将使它们不那么明显,并且始终会根据管路的变化进行自我更新。

希望获得帮助。

答案 3 :(得分:1)

我不知道Nexus,但是我们使用artifactory作为npm repo,在那里我可以通过调用base64encode(username:encryptedPassword)来创建我的身份验证令牌,encryptedPassword是我从我得到的那个个人神器配置文件。

也许这有帮助。

答案 4 :(得分:0)

我刚刚写了一个包装程序,将凭据存储在您的系统钥匙串中,并即时提供它们。检出:https://github.com/Xiphe/npm_keychain_auth

答案 5 :(得分:0)

Before you run npm login, please follow the instructions below :

1) Create an ~/.npmrc file with the following contents:

registry=https://example.com/repository/npm-group/
email=username@example.com
always-auth=true
//example.com/repository/npm-group/:_authToken=

2) run `npm login`

# npm login
Username: firstname.lastname
Password: 
Email: (this IS public) firstname.lastname@example.com
Logged in as firstname,lastname on https://example.com/repository/npm-group/.

Use the same password you use to login to example.com