Как сбросить/изменить пароль в Node.js с помощью Passport.js?

Опубликовано: 25 Сентября, 2022

Сброс/изменение паролей с помощью Passport.js — немного сложный процесс, но в этой статье вы научитесь делать это очень простым и понятным способом.

Синтаксис:

requiredUser.changePassword(oldpassword, 
    newpassword, callback function)

где requiredUser — это пользователь, пароль которого мы хотим изменить.

Подход: мы собираемся использовать метод changePassword паспорта, который принимает два аргумента и функцию обратного вызова, первый аргумент — старый пароль, а второй аргумент — новый пароль.

requiredUser.changePassword(oldpassword, 
    newpassword, function(err) {
    
})

Реализация: Ниже приведена пошаговая реализация описанного выше подхода.

Давайте создадим простое приложение Node.js, которое использует паспорт для регистрации пользователей и сохранения их данных внутри MongoDB с помощью mongoose. Вы можете использовать все, что хотите для хранения данных пользователей, например, MySQL или простой массив. В этой статье мы будем использовать MongoDB.

Внутри этого приложения мы создали маршрут changepassword , который принимает входные значения от пользователей, такие как имя пользователя, старый пароль и новый пароль.

Шаг 1: Инициализирует NPM: создайте и найдите папку проекта в терминале и введите команду

npm init -y

Он инициализирует наше приложение узла и создает файл package.json.

Шаг 2. Установите зависимости. Найдите корневой каталог проекта в терминале и введите команду

npm install express body-parser mongoose passport passportLocalMongoose

Чтобы установить Express, Body Parser, Mongoose, Passport и Passport Local Mongoose в качестве зависимостей внутри вашего проекта.

Шаг 3: Создайте файл сервера: создайте файл «app.js», внутри этого файла потребуются все модули и создайте постоянное «приложение» для создания экземпляра экспресс-модуля, затем используйте mongoose для подключения к локальной базе данных MongoDB.

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
});

Шаг 4: Теперь инициализируйте паспорт , создайте схему пользователя, используйтеpassportLocalMongoose в качестве плагина к схеме пользователя и создайте константу пользователя , которая используется для создания экземпляра пользователя и сохранения его в базе данных MongoDB.

app.use(passport.initialize());
const userSchema = new mongoose.Schema({
   username: String,
   password: String,
});
userSchema.plugin(passportLocalMongoose);
const User = new mongoose.model("User", userSchema);

Шаг 5: Теперь давайте сериализуем и десериализуем пользователя с помощью модуля паспорта.

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);
  });
});

Шаг 6: Создайте маршрут регистрации для регистрации пользователей и маршрут смены пароля , который принимает входные значения от пользователей, такие как имя пользователя, старый пароль и новый пароль.

app.get("/register", function (req, res) {
   res.sendFile("register.html", {
       root: __dirname
   });
});

app.get("/changepassword", function (req, res) {
   res.sendFile("changepassword.html", {
       root: __dirname
   });
});

Шаг 7: Теперь создайте маршрут регистрации для регистрации пользователя, используя метод регистрации паспорта, который принимает два параметра, имя пользователя и пароль, а также обратный вызов, который выдает сообщение об ошибке или успешном завершении.

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")
       }
   });
});

Шаг 8: Как мы уже видели в части подхода, мы должны сначала найти пользователя, пароль которого мы хотим изменить, затем использовать changePassword с двумя параметрами, старый пароль и новый пароль, и обратный вызов, который отправляет ошибку, если есть или отправить сообщение об успешном завершении.

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.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(
    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);

register.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>

изменить пароль.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>

Выход: