How to set _auth for a scoped registry in .npmrc?
Asked Answered
T

3

58

I am wondering how to configure the .npmrc file so that I can have a default registry and a different scoped registry with authentication.

I am using Nexus for the private repository and I am not sure how to set authentication for the scoped registry, only the default registry.

For example my ~/.npmrc file is:

registry=https://registry.npmjs.org/
@test-scope:registry=http://nexus:8081/nexus/content/repositories/npm-test/
[email protected]
_auth="…"

If I do npm publish for a package scoped to test-scope, I get an authentication error.

AFAIK, the _auth only applies to the registry=... section. Is there a way of specifying an auth key for the @test-scope:registry=... section?

Thanks,

Theola answered 21/3, 2018 at 11:16 Comment(5)
if I understood your scenario correctly, you are asking for setting two different auth for your npm-private registry and npm-open registry individually.Akkad
not necessarily npm-open, just npm-private at this stage, although it would be interesting to know how they can both have auth. (I do realise the example has an _auth key)Theola
I don't think there's a way to do this because I think the assumption is you'll be using the same username/password for your registry as your scoped registry. Is there a reason you do not proxy npmjs.org through NXRM? If so, I think you could use the same user/auth and it'd work. That's the expected use case.Lazor
We had some issues with TTL and different versions of the same package using the Nexus proxy so were looking at this as an alternative.Theola
@Lazor FYI - it turns out this is possible. See my answer below.Theola
T
78

So, after some digging through the NPM source code, it turns out there is a way to do this.

My solution is below:

registry=https://registry.npmjs.org/
@test-scope:registry=http://nexus:8081/nexus/content/repositories/npm-test/
//nexus:8081/nexus/content/repositories/npm-test/:username=admin
//nexus:8081/nexus/content/repositories/npm-test/:_password=YWRtaW4xMjM=
email=…

Explanation:

The scope @test-scope specifies that packages with the scope should be published to a different registry than the default registry= when executing the npm publish command.

The two lines starting with //nexus:8081/... are used to specify the credentials to the scoped repository for both username and _password where _password is the base64 encoded password component from the previously used _auth credentials.

Using this approach, only scoped packages will be published and installed from the private registry and all other packages will be installed from the default registry.

Edit:

Additional to this, the password can be specified as an environment variable so that it is not stored in plaintext in the file.

For example:

registry=https://registry.npmjs.org/
@test-scope:registry=http://nexus:8081/nexus/content/repositories/npm-test/
//nexus:8081/nexus/content/repositories/npm-test/:username=admin
//nexus:8081/nexus/content/repositories/npm-test/:_password=${BASE64_PASSWORD}
email=…

Also, when using Nexus, the email= line must be specified.

Theola answered 25/3, 2018 at 6:8 Comment(3)
see my answer for the standard way without storing plan test passsordSeko
Microsoft docs clearly states to append not prepend the scope. Thankfully I found your answerKath
Finally something that helped get me over the line with Gitlab CICD when paired with Nexus! In my .gitlab-ci.yml file I set npm config set 'nexusUrlHere/repository/npm-group/:_auth' "${NEXUS_TOKEN}", then I set NEXUS_TOKEN as a secret in Gitlab and then away we go :)Masterwork
S
20

for some strange reason the _auth is called _authToken when used with scoped packages. If you are using this you don't have to store your plain text password in your .npmrc

registry=https://registry.npmjs.org/
@test-scope:registry=http://nexus:8081/nexus/content/repositories/npm-test/ 
//nexus:8081/nexus/content/repositories/npm-test/:_authToken=...
email=…
Seko answered 16/7, 2018 at 14:33 Comment(0)
S
5

Run the following command, replacing @company-scope with the scope, and company-registry with the name of your company’s npm Enterprise registry:

npm login --scope=@company-scope --registry=https://registry.company-registry.npme.io/

This information is available on the npm documention.

Schist answered 16/9, 2020 at 14:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.