> For the complete documentation index, see [llms.txt](https://agustin-fernandez.gitbook.io/monointegrator/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://agustin-fernandez.gitbook.io/monointegrator/primeros-pasos/user-management.md).

# User Management

User Managerment es un Modulo pensado para ofrecer todo un sistema de Inicio de Sesion con Login unico y vencimiento de Token junto con un espacio de permisos para trabajar con los Endpoints.

## Setup

Para trabajar con UM tenga presente que utilizara SQLite y que esta DB se guardara en el directorio \~/db.

Para inicializar el sistema debe tenerlo habilitado en los .env&#x20;

```properties
ENABLE_USERMANAGEMENT=true
```

Luego de ello, inicialice el mismo ejecutando

```bash
npm run setup:um
```

Esto inicializara la base de datos y le entregara las credenciales para poder iniciar sesion por consola:

```

Se creo la cuenta Admin de User Management 

Nombre de Usuario: administrator
Contrase;a: dec826ce993b83568e22698aa3cc459d

```

Con este, podra iniciar sesion y podra crear usuarios especificandoles premisos para poder trabajar en sus endpoints.&#x20;

## Modo de Uso

Para poder trabajar con este modulo, en su endpoint debe tener `fun['userManagement'].authenticateToken` en la cabecera de su ruta para que esta tenga validaciones de Token y vigencia.\
\
Por otro lado, puede obtener los datos de la session como Nombre del Usuario, Apellido, Token vinculante a la DB (unico por sesion y vinculante al JWT), userID en DB y los permisos.

{% code lineNumbers="true" fullWidth="false" %}

```json
"user": {
    "userid": 1,
    "name": "administrator",
    "lastname": "",
    "token": "8afc05f3-8e64-4b58-bb2f-f4b213f8a7a6",
    "permissions": {
        "createUsers": true
    },
    "iat": 1704295913,
    "exp": 1704299513
}
```

{% endcode %}

* Estos datos, son visibles desde la variable req.user de cada ruta.&#x20;
* La vigencia de los JWT es de 365 dias por default, pero puede modificarlo en las .env indicando `SYSTEMUSER_EXPIRE` en true y `SYSTEMUSER_EXPIRETIME` con el tiempo que quiera, por ejemplo 30m para media hora, o 7d para una semana o 2h30m para dos horas y media.&#x20;
* Puede ver mas informacion aqui: <https://jwt.io/introduction>
* Los token JWT de Session deven viajar en Authorization: Bearer para poder ser reconocidos por monoIntegrator

Un ejemplo de implementacion es el siguiente

{% code lineNumbers="true" fullWidth="false" %}

```javascript
router.all("/privada", fun['userManagement'].authenticateToken, (req, res) => {
    const { id, ip, uri, method } = trx(req);
    try {
      res.status(200).json({ id, ip, uri, method, user: req.user });
    } catch (err) {
      log("error", `Existe un inconveniente - ${id} :: ${ip} :: ${uri} :: ${method} :: ${err}`, "userManagement");
      res.status(500).json({ msg: "Existe un inconveniente en la solicitud", id });
    }
});
module.exports = router;
```

{% endcode %}
