Preventing Brute Force Using Node and Express JS

前端 未结 6 1006
陌清茗
陌清茗 2021-02-05 18:42

I\'m building a website using Node and Express JS and would like to throttle invalid login attempts. Both to prevent online cracking and to reduce unnecessary database calls. Wh

6条回答
  •  情歌与酒
    2021-02-05 18:57

    okk,i found the solution of max login attemp on wrong password in mongoose and expressjs.there is a solution. *first we will define the user schema *second we will define the max login on wrongpassword handler function. *third when we will create the login api then we will check this function that how many times user login with wrong password.so be ready for code

    var config = require('../config');
    
    
    var userSchema = new mongoose.Schema({
        email: { type: String, unique: true, required: true },
        password: String,
        verificationToken: { type: String, unique: true, required: true },
        isVerified: { type: Boolean, required: true, default: false },
        passwordResetToken: { type: String, unique: true },
        passwordResetExpires: Date,
        loginAttempts: { type: Number, required: true, default: 0 },
        lockUntil: Number,
        role: String
    });
    
    userSchema.virtual('isLocked').get(function() {
        return !!(this.lockUntil && this.lockUntil > Date.now());
    });
    userSchema.methods.incrementLoginAttempts = function(callback) {
        console.log("lock until",this.lockUntil)
        // if we have a previous lock that has expired, restart at 1
        var lockExpired = !!(this.lockUntil && this.lockUntil < Date.now());
    console.log("lockExpired",lockExpired)
        if (lockExpired) {
            return this.update({
                $set: { loginAttempts: 1 },
                $unset: { lockUntil: 1 }
            }, callback);
        }
    // otherwise we're incrementing
        var updates = { $inc: { loginAttempts: 1 } };
             // lock the account if we've reached max attempts and it's not locked already
        var needToLock = !!(this.loginAttempts + 1 >= config.login.maxAttempts && !this.isLocked);
    console.log("needToLock",needToLock)
    console.log("loginAttempts",this.loginAttempts)
        if (needToLock) {
            updates.$set = { lockUntil: Date.now() + config.login.lockoutHours };
            console.log("config.login.lockoutHours",Date.now() + config.login.lockoutHours)
        }
    //console.log("lockUntil",this.lockUntil)
        return this.update(updates, callback);
    };
    

    here is my login function where we have checked the max login attempt on wrong password.so we will call this function

    User.findOne({ email: email }, function(err, user) {
            console.log("i am aurhebengdfhdbndbcxnvndcvb")
            if (!user) {
                return done(null, false, { msg: 'No user with the email ' + email + ' was found.' });
            }
    
            if (user.isLocked) {
                return user.incrementLoginAttempts(function(err) {
                    if (err) {
                        return done(err);
                    }
    
                    return done(null, false, { msg: 'You have exceeded the maximum number of login attempts.  Your account is locked until ' + moment(user.lockUntil).tz(config.server.timezone).format('LT z') + '.  You may attempt to log in again after that time.' });
                });
            }
    
            if (!user.isVerified) {
                return done(null, false, { msg: 'Your email has not been verified.  Check your inbox for a verification email.

    emailRe-send verification email

    ' }); } user.comparePassword(password, function(err, isMatch) { if (isMatch) { return done(null, user); } else { user.incrementLoginAttempts(function(err) { if (err) { return done(err); } return done(null, false, { msg: 'Invalid password. Please try again.' }); }); } }); }); }));

提交回复
热议问题