Restablecer/cambiar contraseñas con Passport.js es un proceso un poco complejo, pero en este artículo aprenderá a hacerlo de una manera muy fácil y comprensible.
Sintaxis:
requiredUser.changePassword(oldpassword, newpassword, callback function)
donde el usuario requerido es el usuario cuya contraseña queremos cambiar.
Enfoque: Vamos a utilizar el método de cambio de contraseña de pasaporte que toma dos argumentos y una función de devolución de llamada, el primer argumento es la contraseña anterior y el segundo argumento es la nueva contraseña.
requiredUser.changePassword(oldpassword, newpassword, function(err) { })
Implementación: A continuación se muestra la implementación paso a paso del enfoque anterior.
Vamos a crear una aplicación Node.js simple que use el pasaporte para registrar usuarios y guardar sus datos dentro de MongoDB usando mongoose. Puede usar lo que quiera para almacenar los datos de los usuarios, como MySQL o una array simple. En este artículo, vamos a utilizar MongoDB.
Dentro de esta aplicación, hemos creado una ruta de cambio de contraseña que toma valores de entrada de los usuarios, como nombre de usuario, contraseña anterior y contraseña nueva.
Paso 1: Inicializa NPM: crea y localiza la carpeta de tu proyecto en la terminal y escribe el comando
npm init -y
Inicializa nuestra aplicación de Node y crea un archivo package.json.
Paso 2: Instale las dependencias: ubique el directorio de su proyecto raíz en la terminal y escriba el comando
npm install express body-parser mongoose passport passportLocalMongoose
Para instalar Express, Body Parser, Mongoose, Passport y Passport Local Mongoose como dependencias dentro de su proyecto.
Paso 3: Crear archivo de servidor: Cree un archivo ‘app.js’, dentro de este archivo se requieren todos los módulos y cree una ‘aplicación’ constante para crear una instancia del módulo express, luego use mongoose para conectarse con la base de datos MongoDB local.
const express = require('express') const bodyParser = require('body-parser') const mongoose = require("mongoose"); const passport = require("passport"); const passportLocalMongoose = require("passport-local-mongoose"); const app = express(); mongoose.connect( "mongodb://localhost:27017/passport-forget", { useNewUrlParser: true });
Paso 4: ahora inicialice el pasaporte, cree un esquema de usuario, use pasaporteLocalMongoose como un complemento para el esquema de usuario y cree una constante de Usuario que se usa para crear una instancia de Usuario y guardarla dentro de la base de datos MongoDB.
app.use(passport.initialize()); const userSchema = new mongoose.Schema({ username: String, password: String, }); userSchema.plugin(passportLocalMongoose); const User = new mongoose.model("User", userSchema);
Paso 5: Ahora, vamos a serializar y deserializar al usuario usando el módulo de pasaporte.
passport.use(User.createStrategy()); passport.serializeUser(function (user, done) { done(null, user.id); }); passport.deserializeUser(function (id, done) { User.findById(id, function (err, user) { done(err, user); }); });
Paso 6: cree una ruta de registro para registrar usuarios y una ruta de cambio de contraseña que tome valores de entrada de los usuarios, como nombre de usuario, contraseña anterior y contraseña nueva.
app.get('/register', function (req, res) { res.sendFile('register.html', { root: __dirname }); }); app.get('/changepassword', function (req, res) { res.sendFile('changepassword.html', { root: __dirname }); });
Paso 7: Ahora, cree una ruta de registro para registrar al usuario utilizando el método de registro de pasaporte que toma dos parámetros, nombre de usuario y contraseña, y una devolución de llamada que arroja un mensaje de error o éxito.
app.post('/register', function (req, res) { User.register({ username: req.body.username }, req.body.password, function (err) { if (err) { res.send(err); } else { res.send('successfully registered') } }); });
Paso 8: Como ya vimos en la parte de enfoque, primero debemos encontrar al usuario cuya contraseña queremos cambiar, luego usar changePassword con los dos parámetros, la contraseña anterior y la nueva contraseña, y una devolución de llamada que envía un error si hay alguno o envía un mensaje de éxito.
app.post('/changepassword', function (req, res) { User.findByUsername(req.body.username, (err, user) => { if (err) { res.send(err); } else { user.changePassword(req.body.oldpassword, req.body.newpassword, function (err) { if (err) { res.send(err); } else { res.send('successfully change password') } }); } }); });
Código completo:
aplicación.js
Javascript
const express = require('express') const bodyParser = require('body-parser') const mongoose = require("mongoose"); const passport = require("passport"); const passportLocalMongoose = require("passport-local-mongoose"); mongoose.connect( "mongodb://localhost:27017/passport-forget", { useNewUrlParser: true }); const app = express() app.use(passport.initialize()); const userSchema = new mongoose.Schema({ username: String, password: String, }); userSchema.plugin(passportLocalMongoose); const User = new mongoose.model("User", userSchema); passport.use(User.createStrategy()); passport.serializeUser(function (user, done) { done(null, user.id); }); passport.deserializeUser(function (id, done) { User.findById(id, function (err, user) { done(err, user); }); }); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })) app.get('/register', function (req, res) { res.sendFile('register.html', { root: __dirname }); }); app.get('/changepassword', function (req, res) { res.sendFile('changepassword.html', { root: __dirname }); }); app.post('/register', function (req, res) { User.register({ username: req.body.username }, req.body.password, function (err) { if (err) { res.send(err); } else { res.send('successfully registered') } }); }); app.post('/changepassword', function (req, res) { User.findByUsername(req.body.username, (err, user) => { if (err) { res.send(err); } else { user.changePassword(req.body.oldpassword, req.body.newpassword, function (err) { if (err) { res.send(err); } else { res.send('successfully change password') } }); } }); }); app.listen(3000);
registro.html
HTML
<!DOCTYPE html> <html lang="en"> <head> <title>Document</title> </head> <body> <form action="/register" method="post"> <input type="text" placeholder="Username" name="username"> <input type="password" placeholder="Password" name="password"> <button type="submit">Register</button> </form> </body> </html>
cambiarcontraseña.html
HTML
<!DOCTYPE html> <html lang="en"> <head> <title>Document</title> </head> <body> <form action="/changepassword" method="post"> <input type="text" placeholder="Username" name="username"> <input type="password" placeholder="Old Password" name="oldpassword"> <input type="password" placeholder="New Password" name="newpassword"> <button type="submit"> Change Password </button> </form> </body> </html>
Producción: