# 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 %}

![](/files/-LhHqcJoLglS0pIsZXGD)

{% 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://medellin-js.gitbook.io/workshop-fullstack-js-developer/backend/passport-js/configuracion-passport-js.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
