Как я могу реализовать паспорт с кодом bcrypt, который у меня уже есть? - PullRequest
0 голосов
/ 23 июня 2019

Вы мне не поверите, я пытался сделать больше, чем тонны вещей, пытаясь реализовать паспорт с кодом bcrypt, который у меня уже есть, в течение почти 15 часов сегодня, читая документы и пробуя разные вещи, в основном я пытал себя.

Пожалуйста, кто-нибудь заглянет в мой проект и пару кодов, которые я опубликую здесь, но, пожалуйста, помогите мне, я хотел бы объединить паспорт с кодом bcrypt, который у меня есть, я знаю, что некоторый код будет удален, а некоторые добавлены это нормальный закон, но, пожалуйста, кто-нибудь HEEEELP коды помогут вам понять, как все выглядит, но, пожалуйста, не торопитесь и посмотрите на мой проект на моем GitHub THAAANKS <3 </p>

https://github.com/tigerabrodi/blogcms

Контроллер аутентификации

const path = require('path');
const bcrypt = require("bcryptjs");
const User = require("../models/user");


function getErrorMessage(req) {
    let message = req.flash("error");
    if (message.length > 0) {
        message = message[0];
    } else {
        message = null;
    }
    return message;
}


exports.getLoginPage = (req, res) => {
    res.render("blog/login", {
        pageTitle: "login",
        path: "/login",
        errorMessage: getErrorMessage(req)
    });
}


exports.getsignUpPage = (req, res) => {
    res.render("blog/signup", {
        pageTitle: "signup",
        path: "/signup",
        errorMessage: getErrorMessage(req)
    });
}


exports.postLogin = async (req, res, next) => {
    const {
        username,
        password
    } = req.body;

    try {
        const user = await User.findOne({
            username
        })
        if (!user) {
            req.flash("error", "Invalid Email or Password.");
            res.redirect("/login");
        }
        const correctCredentials = await bcrypt.compare(password, user.password)

        if (!correctCredentials) {
            req.flash("error", "Invalid Email or Password.");
            res.redirect("/login");
        }


        req.session.isLoggedIn = true;
        req.session.user = user;
        const result = await req.session.save(err => {
            if (err) throw err;
            res.redirect("/");
        });


    } catch (err) {
        console.log(err);
        return req.flash("error", "Invalid Email or Password.");
        res.redirect("/login");
    }
}


exports.postLogout = (req, res, next) => {
    req.session.destroy(err => {
        if (err) throw err;
        res.redirect("/");
    })
}


exports.postSignup = (req, res, next) => {

    const {
        username,
        password
    } = req.body;

    const user = new User({
        username,
        password
    });

    User.findOne({
        username
    }, (err, userExists) => {
        if (err) return next(err);
        if (userExists) {
            req.flash("error", "Email exists already, please pick a different one.");

            return res.redirect("/signup");
        }

        user.save(error => {
            if (error) return next(error);
            res.redirect("/login");
        });
    });
};

модель пользователя

const mongoose = require("mongoose"),
Schema = mongoose.Schema,
bcrypt = require("bcryptjs");


const userSchema = new Schema({
username: {
    type: String,
    required: true,
},

password: {
    type: String,
    required: true
}
});


userSchema.pre("save", async function save(next) {
const user = this;
if (!user.isModified("password")) return next();
const hashedPassword = await bcrypt.hash(user.password, 10);
user.password = hashedPassword;
next();
});



module.exports = mongoose.model("User", userSchema);

app.js

require('dotenv').config({path: "node.env"});
const path = require('path');
const express = require('express');

const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const flash = require("connect-flash");

const session = require("express-session");
const MongoDBStore = require("connect-mongodb-session")(session);
const errorController = require('./controllers/error');

const mongodb_uri = process.env.MONGODB_URI;
const app = express();
const csrf = require("csurf");
const User = require("./models/user");

const store = new MongoDBStore({
    uri: mongodb_uri,
    collection: "sessions"
});


const csrfProtection = csrf();


app.set('view engine', 'ejs');
app.set('views', 'views');


const adminRoutes = require("./routes/admin");
const blogRoutes = require("./routes/blog");
const authRoutes = require("./routes/auth");


app.use(bodyParser.urlencoded({
    extended: false
}));


app.use(express.static(path.join(__dirname, 'public')));


app.use(
    session({
        secret: process.env.SECRET,
        cookie: {
            maxAge: 1000 * 60 * 60 * 24 * 7
        },
        store: store,
        resave: false,
        saveUninitialized: false,

    })
);


app.use(flash());
app.use(csrfProtection);


app.use((req, res, next) => {
    if (!req.session.user) {
        return next();
    }
    User.findById(req.session.user._id)
    .then(user => {
        if (!user) {
            return next();
        }
        req.user = user;
        next();
    })
    .catch(err => console.log(err));
});


app.use((req, res, next) => {
    res.locals.isAuthenticated = req.session.isLoggedIn;
    res.locals.csrfToken = req.csrfToken();
    next();
});


app.use(adminRoutes);
app.use(blogRoutes);
app.use(authRoutes);


app.use(errorController.get404);


mongoose.set('useCreateIndex', true);


mongoose.connect(mongodb_uri, {
    useNewUrlParser: true
});


app.listen(3000, function () {
    console.log("listening to port 3000")
})

1 Ответ

0 голосов
/ 23 июня 2019

Вам необходимо хешировать пароль перед тем, как вставить пользователя в базу данных.Вы можете сделать что-то подобное в вашей функции postSignup:

 exports.postSignup = (req, res, next) => {

    const {
        username,
        password
    } = req.body;

    User.findOne({
        username
    }, (err, userExists) => {
        if (err) return next(err);
        if (userExists) {
            req.flash("error", "Email exists already, please pick a different one.");

            return res.redirect("/signup");
        }

        bcrypt.hash(password, 10).then((hashed) =>{
           const user = {
              username,
              hashed 
          };

          User.insert(user);
        });
    });
};

И затем, когда пользователь входит в систему, вам нужно сравнить хешированный пароль с тем, который он ввел.Но я вижу, что вы уже делаете это с const correctCredentials = await bcrypt.compare(password, user.password).

...