Как мне установить _auth в .npmrc при использовании прокси-сервера Nexus https npm?
Контекст
-
Мой файл .npmrc
кажется правильно прочитанным (отмечен с помощью npm config ls -l
как из командной строки, так и из сборки Maven).
-
машина, на которой выполняется npm
, не может напрямую подключаться к сети, она может подключаться только к URL-адресу реестра Nexus npm. Поэтому свойства прокси-сервера proxy
и https-proxy
не заданы.
-
Поскольку доступ к Nexus ограничен, я создал токен доступа из Nexus.
-
Знаки безопасности Nexus сделаны из имени пользователя и пароля, которые содержат символы типа /
, которые обычно должны быть "закодированы по URL"
-
как и ожидалось, с этой конфигурацией при запуске npm install
не обнаруживает прокси.
-
Прокси-сервер Nexus npm, по-видимому, настроен правильно (я могу как обращаться к файлам json
, так и загружать файлы tgz
с помощью веб-браузера после подключения с использованием созданного токена)
-
Если я устанавливаю registry
в http://registry.npmjs.org/
и комментирую _auth
, email
, always-auth
, strict-ssl
свойства и добавляю конфигурацию proxy
и https-proxy
, 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
, чтобы npm install
работал как ожидалось?
Я пробовал до сих пор
- base64Encode (
<username>:<password>
)
- приводит к
npm info retry will retry, error on last attempt: Error: socket hang up
- base64Encode (UrlEncode (
<username>:<password>
))
- приводит к
npm info retry will retry, error on last attempt: Error: This request requires auth credentials. Run `npm login` and repeat the request.
- base64Encode (UrlEncode (
<username>
) :
UrlEncode (<password>
))
- приводит к
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 [email protected]^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
у меня есть следующая трассировка стека:
npm sill fetchPackageMetaData Error: This request requires auth credentials. Run `npm login` and repeat the request.
npm sill fetchPackageMetaData at CachingRegistryClient.authify (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\authify.js:17:14)
npm sill fetchPackageMetaData at CachingRegistryClient.makeRequest (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\request.js:103:17)
npm sill fetchPackageMetaData at <root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\request.js:66:17
npm sill fetchPackageMetaData at RetryOperation._fn (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\attempt.js:18:5)
npm sill fetchPackageMetaData at null._onTimeout (<root>\ui\target\node\node_modules\npm\node_modules\retry\lib\retry_operation.js:49:10)
npm sill fetchPackageMetaData at Timer.listOnTimeout (timers.js:92:15)
npm sill fetchPackageMetaData error for [email protected]^1.0.0 [Error: This request requires auth credentials. Run `npm login` and repeat the request.]
npm WARN install Couldn't install optional dependency: This request requires auth credentials. Run `npm login` and repeat the request.
npm verb install Error: This request requires auth credentials. Run `npm login` and repeat the request.
npm verb install at CachingRegistryClient.authify (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\authify.js:17:14)
npm verb install at CachingRegistryClient.makeRequest (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\request.js:103:17)
npm verb install at <root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\request.js:66:17
npm verb install at RetryOperation._fn (<root>\ui\target\node\node_modules\npm\node_modules\npm-registry-client\lib\attempt.js:18:5)
npm verb install at null._onTimeout (<root>\ui\target\node\node_modules\npm\node_modules\retry\lib\retry_operation.js:49:10)
npm verb install at Timer.listOnTimeout (timers.js:92:15)
Спасибо заранее.
Ответы
Ответ 1
После просмотра кода registry-client
я нашел ответ, вот он. Я отправляю его, поскольку это может помочь другим людям:
base64Encode(<username>:<password>)
Кстати, есть URL-кодировка, но она authify.js
, которая позаботится об этом.
Проблема "зависания сокета", с которой я столкнулась, связана с тем, что если прокси установлен в конфигурации Windows, при запуске npm
из CLI (а не из сборки Maven) все `` `.npmrc `` Параметры прокси-сервера, похоже, игнорируются, а собственные прокси-исключения (для корпоративных URL-адресов) игнорируются npm. Я открою билет, чтобы сообщить об этом странном поведении.
Ответ 2
https://books.sonatype.com/nexus-book/reference/npm-deploying-packages.html
$ echo -n 'username:password' | openssl base64
Ответ 3
Я не знаю о Nexus, но мы используем artifactory в качестве ретрансляции npm, и там я могу создать свой токен аутентификации, вызвав base64encode(username:encryptedPassword)
с encryptedPassword
тем, что я получаю от своего личного профиля artifactory.
Возможно, это помогает.
Ответ 4
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 protected]
always-auth=true
//example.com/repository/npm-group/:_authToken=
2) run 'npm login'
# npm login
Username: firstname.lastname
Password:
Email: (this IS public) [email protected]
Logged in as firstname,lastname on https://example.com/repository/npm-group/.
Use the same password you use to login to example.com
Ответ 5
Я только что написал оболочку, которая хранит учетные данные в вашей системной цепочке для ключей и предоставляет их на лету. Проверьте: https://github.com/Xiphe/npm_keychain_auth
Ответ 6
Если у вас есть токен авторизации, вы не должны использовать имя пользователя: пароль.
Я предлагаю вам:
Создать токен
- Удалите ~/.npmrc или переименуйте его.
- Убедитесь, что настройки env, такие как $ NPM_CONFIG_ *, не установлены.
- Убедитесь, что настройки электронной почты и другие настройки не установлены, используя:
npm config list
- Войдите в npm, используя:
npm login --registry=https://nexus.whatever.registry/respository/npm-whatever-group/
- Как только вы вошли - вы вошли. Npm должен сгенерировать для него токен в вашем ~/.npmrc. Это будет выглядеть так:
//nexus.whatever.registry/respository/npm-whatever-group/:_authToken=NpmToken.YOUR-LOVELY-TOKEN-IN-HEX
- Вы можете использовать этот токен в своем проекте, конвейере 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/
Если у вас есть проблемы с аутентификацией/сертификатами:
- добавить переменную env (также в вашу линию CI/CD)
$ NODE_EXTRA_CA_CERTS для указания на /home/wherever/is/your/cert.pem
Для конвейеров CI/CD (например, gitlabs или jenikins):
- рассмотрите возможность замены фактических значений из файла проекта .npmrc на
${RELEVANT_ENV_VARIABLES}
. Таким образом, вы сделаете их менее заметными и всегда будете обновляться при смене pipeопровода.
Надеюсь, это поможет.