web-dev-qa-db-fra.com

Comment définir _auth dans .npmrc avec un proxy de registre Nexus https npm?

Le contexte

  1. Mon fichier .npmrc semble être correctement lu (vérifié avec npm config ls -l à la fois en ligne de commande et à partir de la construction Maven).

  2. la machine sur laquelle npm est exécuté ne peut pas se connecter directement au réseau, elle ne peut se connecter qu’à une URL de registre Nexus npm. Par conséquent, les propriétés de proxy proxy et https-proxy ne sont pas définies.

  3. L'accès à Nexus étant restreint, j'ai généré un jeton d'accès à partir de Nexus. 

  4. Les jetons de sécurité Nexus sont constitués d'un nom d'utilisateur et d'un mot de passe, qui contiennent tous deux des caractères tels que / qui doivent généralement être "codés par l'URL".

  5. comme prévu, avec cette configuration, lors de l'exécution de npm install, aucun proxy n'est détecté.

  6. Le proxy de registre Nexus npm semble être correctement défini (je peux à la fois accéder aux fichiers json et télécharger les fichiers tgz à l'aide d'un navigateur Web après m'être connecté à l'aide du jeton généré)

  7. Si je règle registry sur http://registry.npmjs.org/ et commente _auth, email, always-auth, strict-ssl propriétés et que j'ajoute les configurations proxy et https-proxy, npm install fonctionne comme prévu (mais je ne pourrai pas le faire dans l'environnement cible)

Contenu du fichier .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

Question

Comment dois-je générer correctement la propriété _auth pour que npm install fonctionne comme prévu?

J'ai essayé jusqu'à présent

  1. base64Encode (<username>:<password>)
    • résultats dans npm info retry will retry, error on last attempt: Error: socket hang up
  2. base64Encode (code url (<username>:<password>))
    • résultats dans npm info retry will retry, error on last attempt: Error: This request requires auth credentials. Run `npm login` and repeat the request. 
  3. base64Encode (urlencode (<username>) :urlencode (<password>)) .________.
    • résultats dans npm info retry will retry, error on last attempt: Error: socket hang up

Lors de l'obtention de l'erreur socket hang up, j'ai la trace de pile suivante:

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)

Lors de l'obtention de l'erreur This request requires auth credentials, j'ai la trace de pile suivante:

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 fsevents@^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)

Merci d'avance.

20
Kraal

Après avoir regardé registry-client code, j'ai trouvé la réponse, la voici. Je le poste car cela peut aider d'autres personnes:

base64Encode(<username>:<password>)

A propos, il existe un encodage d'URL, mais c'est authify.js qui s'en occupe.

Le problème de "prise de ligne" auquel je suis confronté est dû au fait que si un proxy est défini dans la configuration Windows, lors du lancement de npm à partir de la CLI (et non à partir d'une construction Maven), tous les paramètres de proxy `` `` .npmrc`` semblent à ignorer alors que les exclusions de proxy natif (pour les URL d'entreprise) sont ignorées par npm. Je vais ouvrir un ticket pour signaler ce comportement étrange.

4
Kraal
21
Peter Tseng

Je ne connais pas Nexus, mais nous utilisons artifactory comme référentiel npm, et je peux créer mon jeton d'authentification en appelant base64encode(username:encryptedPassword) avec encryptedPassword comme étant celui obtenu avec mon profil d'artéfact personnel. 

Peut-être que cela aide.

1
Christian Heigele

Je viens d'écrire un emballage qui stocke les informations d'identification dans le trousseau de vos systèmes et les fournit à la volée. Découvrez: https://github.com/Xiphe/npm_keychain_auth

0
xiphe