Trabajando con registros NPM privados
Published: 2022-03-01 02:59:59

*El contenido presentado es orientado al ambiente de desarrollo con JS y TS, y hay una gran cantidad de recursos que pueden explicar este contenido, pero yo trataré de explicarlo de la forma más clara y sencilla que me sea posible. <br /><br /> Claro está que también compartiré las cosas con las que me he encontrado y te daré la solución con un fundamento detrás para que no solo hagas copy/paste*

Los registros privados son muy comunes, en el entorno empresarial; cuando se requiere alojar múltiples módulos de uso interno, sin necesidad de pagar por el servicio organizacional de npm. También servicios de alojamiento de repositorios como Github y GitLab ofrecen la funcionalidad de tener esta característica.

## Contenidos
* [Login](#login)
  - [Login con 2FA activo](#login2fa)
* [Instalación](#installation)

## Login
<a id="login"><a/>

El login es sencillo, recordemos que por defecto siempre se va a apuntar al registro público de [npm]( https://registry.npmjs.org), entonces, para hacer el login basta con ejecutar:

```bash
npm login
```
ó bien para apuntar a un registro privado:

```bash
npm login --regsitry <dirección-del-registro>
```

**Cambiar la configuración del registro por defecto**, también es fácil:

```bash
npm config set registry <dirección-del-registro>
```

con esta modificación se puede ejecutar _**npm login**_ y el login será directo a la dirección del registro que se asignó

> NOTA: Esta configuración solo será aplicada de forma "local", pero para que las modificaciones tomen efecto para todo el sistema recuerda usar la bandera **_--global_**

### Login con 2FA activo
<a id="login2fa"><a/>

Cuando se hace uso del Two-Factor Authentication (2FA), se requiere un token para poder hacer un login "exitoso". Si se realiza un login sin el token y se trata de instalar alguna dependencia organizacional o de un repositorio privado; la instalación fallará.

Para lograr realizar la instalación se tiene que realizar lo siguiente:

1.- Ejecutar: **`npm login`**
2.- Obtener el token que se ha creado

> Este token se genera automáticamente, se encuentra en el archivo .npmrc ubicado en el directorio $HOME <br/><br/> En Windows es: C:/Users/<tu-usuario> y en Linux, si soy sincero, no lo recuerdo y no quiero obtener la respuesta de google; quiero reforzar un poco la memoria. Pero puedes obtener la ruta del directorio con $HOME. <br/><br/> El token es la cadena de texto dentro de las comillas después de **_:authToken=_**, este a su vez deberá corresponder de la dirección del registro a la cual está asignada.

3.- Volver a ejecutar el login pero agregando el token al final de la siguiente forma:

```bash
npm login --regsitry <dirección-del-registro>/:_authToken=<token>
```
4.- Volver a tratar de instalar las dependencias

## Instalación
<a id="installation"><a/>

Cuando se hace uso de los registros que proveen servicios como Gitlab, se requiere un token (con los permisos para acceder al registro), puedes encontrar más información en [Gitlab | Package Registry](https://docs.gitlab.com/ee/user/packages/package_registry/).

> NOTA: El token para la instalación de dependencias **no** es el mismo que el token que se requiere para hacer el login

Es común que en los proyectos se llegue a ver un archivo .npmrc dentro del proyecto, con la configuración para poder conocer los scopes (alcances) de las dependencias que el proyecto requiere

> NOTA: Es IMPORTANTE que NUNCA, NUNCA, NUNCA se agreguen tokens o keys dentro de estos, por cuestiones de seguridad, es más conveniente que se usen variables de entorno para asignarlos.

Como se puede ver en [Gitlab](https://docs.gitlab.com/ee/user/packages/npm_registry/index.html#authenticate-with-a-ci-job-token), hay varias formas de identificar a los módulos/dependencias de un proyecto. En la documentación se centra en el CI/CD, pero se puede realizar a nivel instancia, como se expondrá en este articulo.

Primero en el proyecto, debe de existir el fichero .npmrc, en el que se deberá identificar al registro del cual se obtendrán las dependencias, como por ejemplo:

````bash
@foo:registry=https://gitlab.example.com/api/v4/packages/npm/
//gitlab.example.com/api/v4/packages/npm/:_authToken=${TOKEN}
```

> NOTA: Es importante que se mantenga la sección **_${TOKEN}_**, esto; tomará el valor de la variable que se indica entre las llaves

Ahora, deberás generar un [token](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html), como ya se mencionó este token deberá tener permisos para poder acceder al registro.

Este token puede ser usado como variable del entorno, si se ejecuta el siguiente comando:

```bash
export TOKEN=<token>
```

Esto funcionará siempre en entornos *NIX, en sistemas Windows, en lo personal uso Git Bash pero desafortunadamente con esta ultima opción; esto no persiste en el entorno. En entornos Windows con sub kernel de linux, desconozco si funciona.

Hecho esto, ya se podrán instalar las dependencias desde los registros privados.