Sesiones persistentes en Express con AWS DynamoDB

Sesiones persistentes en Express con AWS DynamoDB Créditos de imagen: Unsplash

En mi artículo Instalación de AWS DynamoDB en un equipo local he descrito la forma de preparar un entorno de desarrollo con DynamoDB, instalando esta DB en un contenedor Docker.

En esta ocasión mostraré el código necesario dentro de una la aplicación Express (Node.js) para hacer las sesiones de los usuarios persistentes durante los reinicios del servidor web.

Instalación de los paquetes npm

Dentro de la carpeta de la aplicación Express, instalaremos los paquetes npm necesarios para crear el middleware que se conectará a la BD.

$ npm install --save express-session aws-sdk connect-dynamodb

Añadir el código al app.js

En el fichero donde se declara la sesión, se añadirá el siguiente código.

const session = require('express-session')
const AWS = require('aws-sdk')
const DynamoDBStore = require('connect-dynamodb')(session)

AWS.config.update({
  region: 'eu-west-2',
  endpoint: 'http://localhost:8111'
});
const dynamodb = new AWS.DynamoDB();

app.use(session({
  secret: 'clave-secreta',
  resave: false,
  saveUninitialized: false,
  store: new DynamoDBStore({
    client: dynamodb,
    table: 'sessionstore'
  })
}));

El objeto AWS lo deberemos configurar según la aplicación corra en nuestro entorno de desarrollo local (aquí la propiedad region es indiferente), o en producción dentro de la nube de Amazon (se deberá modificar la propiedad endpoint para que apunte a DynamoDB dentro de AWS).

No es necesario crear la tabla manualmente, pues al definir DynamoDBStore se crea automáticamente.

En este momento ya se puede iniciar el servidor web y probar su funcionamiento.

Consultar la tabla de sesiones en DynamoDB

Una vez iniciado el servidor y abierta nuestra web en el navegador, en otra terminal usaremos el programa AWS CLI para comprobar la creación de la tabla de sesiones en la BD local.

En caso de no tener AWS CLI instalado, aquí tiene las instrucciones para instalarlo.

$ aws dynamodb list-tables --endpoint http://localhost:8111

Debería proporcionar la siguiente salida:

{
    "TableNames": [
        "sessionstore"
    ]
}

Una vez que hayamos logeado algún usuario, podremos consultar la tabla de sesiones para comprobar que todo ha funcionado correctamente.

$ aws dynamodb describe-table --table-name sessionstore --endpoint http://localhost:8111

El resultado de la anterior instrucción será la descripción de la tabla de sesiones creada automáticamente:

{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "id",
                "AttributeType": "S"
            }
        ],
        "TableName": "sessionstore",
        "KeySchema": [
            {
                "AttributeName": "id",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": 1596962328.349,
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": 0.0,
            "LastDecreaseDateTime": 0.0,
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 204,
        "ItemCount": 1,
        "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/sessionstore"
    }
}

Y con la siguiente instrucción obtendremos el contenido de la tabla:

$ aws dynamodb scan --table-name sessionstore --endpoint http://localhost:8111
{
    "Items": [
        {
            "expires": {
                "N": "1606157337"
            },
            "id": {
                "S": "sess:z72sV7ZmW54dY5eNAtNAzmmWh5iWlq-W"
            },
            "type": {
                "S": "connect-session"
            },
            "sess": {
                "S": "{\"cookie\":{\"originalMaxAge\":8640000000,\"expires\":\"2020-11-23T18:42:30.345Z\",\"secure\":true,\"httpOnly\":true,\"path\":\"/\"},\"flash\":{},\"passport\":{\"user\":12}}"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

Comprobar que la sesión es persistente

Para simular una caída del servidor, desde la terminal donde se ejecuta lo paramos. Ahora si refrescamos nuestra web en el navegador nos aparecerá el error ERR_CONNECTION_REFUSED.

Iniciamos de nuevo el servidor y volvemos a refrescar la web para comprobar si el usuario continúa logeado.

De esta forma, cuando subamos nuestra web a la nube sólo tendremos que cambiar el parámetro endpoint: 'http://localhost:8111' por la dirección en que se encuentre DynamoDB en AWS.

Artículos relacionados

Comentarios