# Estrategia Local

### Passport-local

Este módulo le permite autenticar utilizando un nombre de usuario y contraseña en sus aplicaciones Node.js. Al conectarse a *Passport*, la autenticación local se puede integrar de forma sencilla y discreta en cualquier aplicación o framework que admita middleware de estilo Connect, incluido Express.

### Uso de estrategias de Passport

Ahora vamos a definir las estrategias de Passport para manejar el **inicio de sesión** y la **suscripción**. Cada uno de ellos sería una instancia de la **Estrategia de autenticación local** de Passport y se crearía utilizando la función `passport.use()` .&#x20;

#### Estrategia de acceso

La estrategia local se ve así:

{% code title="auth/local/passport.js" %}

```javascript
/**
 * Auth Local passport configuration
 */

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

function localAuthenticate(User, email, password, done) {
  User.findOne({ email: email.toLowerCase() }).exec()
    .then((user) => {
      if (!user) {
        return done(null, false, {
          message: 'This email is not registered.',
        });
      }
      return user.authenticate(password, (authError, authenticated) => {
        if (authError) {
          return done(authError);
        }
        if (!authenticated) {
          return done(null, false, { message: 'This password is not correct.' });
        }
        return done(null, user);
      });
    })
    .catch(err => done(err));
}

function setup(User) {
  passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password', // this is the virtual field on the model
  }, (email, password, done) => localAuthenticate(User, email, password, done)));
}

module.exports = { setup };

```

{% endcode %}

El primer parámetro de `passport.use()` es el **nombre** de la estrategia que se utilizará para identificar esta estrategia cuando se aplique posteriormente, *en nuestro caso no la usamos*. El segundo parámetro es el **tipo** de estrategia que desea crear, aquí usamos el [username-password](http://passportjs.org/guide/username-password/) o LocalStrategy. Debe tenerse en cuenta que, por defecto, LocalStrategy espera encontrar las credenciales de usuario en los parámetros de nombre de usuario `usernameField` y contraseña `passwordField`, pero también nos permite utilizar otros parámetros con nombre.&#x20;

Seguidamente vamos a crear un archivo `index.js` dentro de la carpeta `auth/local` este archivo será la ruta para manejar login de nuestra aplicación.

{% code title="auth/local/index.js" %}

```javascript
/**
 * Auth Local configuration
 */

const express = require('express');
const passport = require('passport');

const { signToken } = require('../auth.service');

const router = express.Router();

router.post('/', (req, res, next) => {
  passport.authenticate('local', (err, user, info) => {
    const error = err || info;
    if (error) {
      return res.status(401).json(error);
    }
    if (!user) {
      return res.status(404).json({ message: 'Something went wrong, please try again.' });
    }

    const token = signToken(user._id, user.role);
    return res.json({ token });
  })(req, res, next);
});

module.exports = router;

```

{% endcode %}

***Nota***: `const { signToken } = require('../auth.service');` Esta función la construiremos en el siguiente paso.

{% hint style="info" %}
Passport authenticate: <http://www.passportjs.org/docs/authenticate/>
{% endhint %}

### Repositorio: [Add the passport strategy](https://github.com/colombia-dev/medjs-workshop-fullstack-js-backend/commit/bdbb89c8f9dc05ff9c73073c6f881d1c93269824)
