Passport sólo proporciona el mecanismo para manejar la autenticación, dejando la responsabilidad de implementar la sesión de manipulación de nosotros mismos y para eso vamos a utilizar express-session .
Esto es necesario ya que queremos que nuestras sesiones de usuario sean persistentes por naturaleza. Antes de ejecutar la aplicación, debemos instalar express-session y añadirla a nuestra lista de dependencias en package.json
.
Para hacer eso:
Copy # Install Dependecies
npm i -S connect-mongo express-session
El módulo npm connect-mongo
no puede manejar mongodb+srv://
cadenas de conexión. Tendrá que usar los tipos de cadena de conexión más antiguos que comienzan con mongodb://
. Como estamos utilizando MongoDB Atlas, debemos conectarnos a Atlas e ir a la vista de clúster, luego conecte su aplicación y luego seleccione Node.js versión 2.2.12, no 3.0. Y no olvide cambiar el /test
en su cadena de conexión a /TheNameOfYourDatabase
con el nombre de su base de datos.
Así que vamos a cambiar nuestro string de conexión de MongoDB en el archivo config/environment/index.js
por este nuevo valor.
config/environment/index.js
Copy /**
* Default specific configuration
*/
const all = {
...
// MongoDB connection options
mongo: {
// Change de connection string
uri: process.env.MONGODB_URI || 'mongodb://<username>:<password>@cluster0-shard-00-00-9bgzf.mongodb.net:27017,cluster0-shard-00-01-9bgzf.mongodb.net:27017,cluster0-shard-00-02-9bgzf.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true&w=majority',
} ,
};
module . exports = all;
Luego de esto, en nuestro archivo de configuración de express vamos agregar las siguientes lineas:
Copy // New Lines
const connectMongo = require ( 'connect-mongo' );
const session = require ( 'express-session' );
const passport = require ( 'passport' );
const config = require ( './environment' );
const MongoStore = connectMongo (session);
app .use ( passport .initialize ());
app .use ( session ({
secret : config . secrets .session ,
saveUninitialized : true ,
resave : false ,
store : new MongoStore ({
url : config . mongo .uri ,
}) ,
}));
Finalmente nuestro archivo de configuración de express se verá así:
Copy /**
* Express configuration
*/
const compression = require ( 'compression' );
const bodyParser = require ( 'body-parser' );
const methodOverride = require ( 'method-override' );
const errorHandler = require ( 'errorhandler' );
const logger = require ( 'morgan' );
// New Lines
const connectMongo = require ( 'connect-mongo' );
const session = require ( 'express-session' );
const passport = require ( 'passport' );
const config = require ( './environment' );
const MongoStore = connectMongo (session);
module . exports = (app) => {
const env = app .get ( 'env' );
app .use ( compression ());
app .use ( bodyParser .urlencoded ({ extended : false , limit : '50mb' }));
app .use ( bodyParser .json ({ limit : '50mb' }));
app .use ( methodOverride ());
app .use ( logger ( 'dev' ));
// New line
app .use ( passport .initialize ());
// New line
app .use ( session ({
secret : config . secrets .session ,
saveUninitialized : true ,
resave : false ,
store : new MongoStore ({
url : config . mongo .uri ,
}) ,
}));
if (env === 'development' || env === 'test' ) {
app .use ( errorHandler ()); // Error handler - has to be last
}
};
Ahora vamos agregar nuestra ruta de estrategia local al archivo de rutas.
Copy /**
* Main application routes
* @author : Cristian Moreno Zuluaga <khriztianmoreno@gmail.com>
*/
// Import Endpoints
const helloWorld = require ( './api/helloworld' );
const product = require ( './api/product' );
const user = require ( './api/user' );
// New line
const auth = require ( './auth' );
module . exports = (app) => {
app .use ( '/api/helloworld' , helloWorld);
app .use ( '/api/products' , product);
app .use ( '/api/users' , user);
// New line
app .use ( '/auth' , auth);
};
Esta ruta será la encargada de validar el login de un usuario. Podemos probar en postman esto /api/users
Request Body:
Copy {
"name" : "CRISTIAN MORENO" ,
"email" : "khriztianmoreno@myemail.com" ,
"password" : "my-secret-password"
}
Response:
Copy {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OWFiNzkyMWQ1Yzk3NjJlZGQzZmUwZDgiLCJpYXQiOjE1MDQ0MDk4ODksImV4cCI6MTUwNDQyNzg4OX0.2gZPXZ-dQc3kQ1fcIDryHm4gIqWLvcw6guAOnP0ueGU"
}