# Token Management

## Permisos

Para poder manejar los tokens, es necesario que el usuario tenga los siguientes asignados:

```javascript
{ createToken: true, deleteToken: true, viewToken: true }
```

* **createToken**: Podras crear y recrear token como tambien asignar permisos
* **deleteToken**: Podras eliminar token
* **viewToken**: Podras ver todos los tokens asociados a tu cuenta como los permisos asignados

Ahora, tambien existe el permiso `adminUser` que permitira realizar todo lo anterior sobre el usuario iniciado, pero tambien sobre los demas.&#x20;

## API Endpoints

### **Crear Token**

Puede enviar o no un Body, indicando el usuario vinculante al Token a crear.&#x20;

* **Método**: POST
* **URL**: `{{server}}/management/token/create`
* **Autorización**: Token Bearer (`{{session}}`)

**Cuerpo**

```json
{
    "userid": 1
}
```

**Respuesta**

```json
{
    "tokenid": 5,
    "userid": 1,
    "bearer": "77b947c7-68ce-43f6-ae90-bd8a1dcbf503",
    "permissions": null,
    "createdAt": "2024-01-03T22:49:30.155Z",
    "updatedAt": "2024-01-03T22:49:30.155Z",
    "deletedAt": null
}
```

### **Eliminar Token**

Simplemente debe indicar el tokenid en URL

* **Método**: DELETE
* **URL**: `{{server}}/management/token/:tokenId`
* **Autorización**: Token Bearer (`{{session}}`)
* **Variables de URL**:
  * `tokenId`: `{{tokenid}}`

### **Establecer Permisos**

* **Método**: PUT
* **URL**: `{{server}}/management/token/permissions/:tokenid`
* **Autorización**: Token Bearer (`{{session}}`)

**Cuerpo**

```json
{
  "permissions": {
    "createA": true,
    "createB": true,
    "createC": true
  }
}
```

* **Variables de URL**:
  * `tokenid`: `{{tokenid}}`

**Respuesta**

```json
{
    "mensaje": "Se asignaron los permisos al Token indicado"
}
```

### &#x20;**Regenerar Token**

* **Método**: PUT
* **URL**: `{{server}}/management/token/regenerate/:tokenid`
* **Autorización**: Token Bearer (`{{session}}`)
* **Variables de URL**:
  * `tokenid`: `{{tokenid}}`

**Respuesta**

```json
{
    "tokenid": 3,
    "userid": 1,
    "bearer": "f126696d-203b-46d2-9d90-2f350a04bb8b",
    "permissions": "{\"createA\":true,\"createB\":true,\"createC\":true}",
    "createdAt": "2024-01-03T19:46:28.181Z",
    "updatedAt": "2024-01-03T19:46:31.591Z",
    "deletedAt": null
}
```

### **Leer Permisos**

* **Método**: GET
* **URL**: `{{server}}/management/token/permissions/:tokenid`
* **Autorización**: Token Bearer (`{{session}}`)
* **Variables de URL**:
  * `tokenid`: `{{tokenid}}`

**Respuesta**

```json
{
    "permissions": {
        "createA": true,
        "createB": true,
        "createC": true
    }
}
```

### **Listar Tokens**

Puede listar los tokens registrados por usuario, indicandolo al final de la URL. En caso de no indicarlo, mostrara los Token de su sesion activa.

* **Método**: GET
* **URL**: `{{server}}/management/tokens/list/:userid?`
* **Autorización**: Token Bearer (`{{session}}`)

### **Ruta Tokenizada**

Esta es una ruta que se ubica en el directorio de \~/routes/userManagement/token/tokenizada.js siendo de ejemplo para implementacion

* **Método**: GET
* **URL**: `{{server}}/tokenizada`
* **Autorización**: Token Bearer (`{{bearer}}`)

## Modo de Uso

La forma de trabajar con los Tokens es simple, debe indicar en su ruta `fun['userManagement'].authenticateToken` siendo que esto busca el Bearer y dejara la informacion del mismo en req.bearer.\
\
Un ejemplo practico es el siguiente:

{% code lineNumbers="true" %}

```javascript
router.get("/tokenizada", fun['userManagement'].authenticateToken, (req, res) => {
    const { id, ip, uri, method } = trx(req);
    try {
      res.status(200).json({ id, ip, uri, method, bearer: req.bearer });
    } 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 %}

El contenido de req.bearer es el siguiente

```json
"bearer": {
    "userid": 1,
    "tokenid": 5,
    "token": "77b947c7-68ce-43f6-ae90-bd8a1dcbf503",
    "permissions": {
        "createA": true,
        "createB": true,
        "createC": true
    }
}
```
