# Configuración Passport.js

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](https://github.com/expressjs/session).&#x20;

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](https://github.com/expressjs/session) y añadirla a nuestra lista de dependencias en `package.json`.&#x20;

Para hacer eso:

```bash
# 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.

![Connect to Cluster](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-Lgyno4NC7rhy49BAEjN%2F-LhCwA2LgiSLBcP8clqz%2F-LhD3UQRTFZLMeqcDx6x%2FScreen%20Shot%202019-06-12%20at%206.35.52%20PM.png?alt=media\&token=02f26926-1d5c-4372-a547-f81ac876b1cc)

Así que vamos a cambiar nuestro string de conexión de MongoDB en el archivo `config/environment/index.js` por este nuevo valor.

{% code title="config/environment/index.js" %}

```javascript
/**
 * 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;

```

{% endcode %}

Luego de esto, en nuestro archivo de configuración de express vamos agregar las siguientes lineas:

{% code title="config/express.js" %}

```javascript
// 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,
    }),
  }));
```

{% endcode %}

Finalmente nuestro archivo de configuración de express se verá así:

{% code title="config/express.js" %}

```javascript
/**
 * 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
  }
};

```

{% endcode %}

Ahora vamos agregar nuestra ruta de estrategia local al archivo de rutas.

{% code title="routes.js" %}

```javascript
/**
 * 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);
};

```

{% endcode %}

![](https://2462303721-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LhH_i6obIRi4vB9Keqw%2F-LhHo0b8o4ExdIS03ptx%2F-LhHqcJoLglS0pIsZXGD%2FScreen%20Shot%202019-06-13%20at%201.04.49%20PM.png?alt=media\&token=5ecbdb4e-25dc-419d-8466-736c8498bd28)

{% hint style="info" %}
Esta ruta será la encargada de validar el login de un usuario. Podemos probar en postman esto **`/api/users`**&#x20;

**`Request Body:`**

```javascript
{
  "name": "CRISTIAN MORENO",
  "email": "khriztianmoreno@myemail.com",
  "password": "my-secret-password"
}
```

**`Response:`**&#x20;

```
{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OWFiNzkyMWQ1Yzk3NjJlZGQzZmUwZDgiLCJpYXQiOjE1MDQ0MDk4ODksImV4cCI6MTUwNDQyNzg4OX0.2gZPXZ-dQc3kQ1fcIDryHm4gIqWLvcw6guAOnP0ueGU"
}
```

{% endhint %}

### Repositorio: [Configuration passport.js](https://github.com/colombia-dev/medjs-workshop-fullstack-js-backend/commit/107d1f15f99c80282462221dc127aa4f02667b45)
