首页 > 解决方案 > passport.js 登录不起作用

问题描述

我使用 mongodb 和 mongoose 作为我的数据库,我可以注册用户,但是一旦注册就无法登录。当我点击登录时,它会继续加载并且永远不会停止。我在互联网上搜索了答案,但找不到。希望得到积极的答复。

我试图弄清楚,但我没有成功。

这是代码:

auth.js(包含登录功能)

router.route('/login')
     .get((req, res, next)=>{
     let context = {}
     res.render('login', context)
})
     .post(passport.authenticate('local',{
      successRedirect: '/',
      failureRedirect:'/login'
}));

users.js(数据库文件)(我正在使用 mongodb)

const mongoose = require('mongoose');
const crypto = require('crypto');

let userSchema = new mongoose.Schema({
    email:{
        type:String,
        unique:true,
        required:true,
    },
    name:{
        type:String,
        required:true,
    },
    hash:String,
    salt:String,
    facebookId:String
});

userSchema.methods.setPassword = function (password){
    this.salt = crypto.randomBytes(16).toString('hex');
    this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64, 'sha1').toString('hex');
}


userSchema.methods.validPassword = function(password){
    let hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64, 'sha1').toString('hex');
    return this.hash === hash;
}

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

护照.js

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

passport.serializeUser(function(user, done){
    done(null, user.id);
});

passport.deserializeUser(function(id, done){
    User.findById(id, function(err, user){
        done(err, user);
    });
});

passport.use(new LocalStrategy({
    usernameField:'email'
},
function(username, password, done){
    User.findOne({email:username, function(err, user){
        if(err) return done(err);
        if(!user){
            return done(null, false,{
                message:'incorrect username and password'
            });
        }
        if(!user.validPassword(password)){
            return done(null, false, {
                message: 'incorrect username and password'
            });
        }
        return done(null, user);
    }});
}

));

register.hbs(Html 文件)

<h3>New Account</h3>
<div class="mdl-grid center">
    <form method="post" class="registerForm">
        {{#each errorMessages}}
        <div class="dialog mdl-cell mdl-cell--3-offset-desktop mdl-cell--1-offset-tablet mdl-cell--6-col">
            {{this.msg}}
        </div>
        {{/each}}
        <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label mdl-cell mdl-cell--6-col">
            <input class="mdl-textfield__input" type="text" id="name" name='name' value="{{ name }}">
            <label class="mdl-textfield__label" for="name">First Name</label>
        </div>
        <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label mdl-cell mdl-cell--6-col">
            <input class="mdl-textfield__input" type="email" id="email" name='email' value="{{ email }}">
            <label class="mdl-textfield__label" for="email">Email</label>
        </div>
        <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label mdl-cell mdl-cell--6-col">
            <input class="mdl-textfield__input" type="password" id="pass" name='password' value="{{ password }}">
            <label class="mdl-textfield__label" for="password">Password</label>
        </div>
        <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label mdl-cell mdl-cell--6-col">
            <input class="mdl-textfield__input" type="password" id="c_pass" name='c_pass' value="{{ c_pass }}">
            <label class="mdl-textfield__label" for="c_pass">Confirm Password</label>
        </div>
        <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored mdl-cell mdl-cell--6-col" type="submit">
            Register
        </button>

        <div>or</div>

        <a class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored mdl-cell mdl-cell--6-col" href='/auth/facebook'>
            Sign In with Facebook
        </a>

    </form>
</div>

app.js(主文件)

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
const bodyParser = require('body-parser');
const expressValidator = require('express-validator');

const mongoose = require('mongoose');

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

require('./passport');
const config = require('./config');

var indexRouter = require('./routes/index');
var authRouter = require('./routes/auth');


mongoose.connect(config.databaseConn, { useNewUrlParser: true });
global.User = require('./models/user.js');

var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator());
app.use(cookieParser());
app.use(session({
  secret:config.sessionKey,
  resave:false,
  saveUninitialized:true,
  cookie:{secure:true}
}));
app.use(passport.initialize());
app.use(passport.session());

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

app.use((req, res,next)=>{
  if(req.isAuthenticated()){
    res.locals.user =req.user;
  }
  next();
});

app.use('/', indexRouter);
app.use('/', authRouter);

这不是完整的代码。完整代码请参考以下链接。 https://github.com/satyamdhawan/collaborative_editor

请查看 GitHub 上的完整代码。

标签: node.jsexpressloginpassport.js

解决方案


你能检查一下是否改变这个:

passport.use(new LocalStrategy({
    usernameField:'email'
},
function(username, password, done){
    User.findOne({email:username, function(err, user){
        if(err) return done(err);
        if(!user){
            return done(null, false,{
                message:'incorrect username and password'
            });
        }
        if(!user.validPassword(password)){
            return done(null, false, {
                message: 'incorrect username and password'
            });
        }
        return done(null, user);
    }});
}

对此:

passport.use(
    'local',
    new LocalStrategy(
        {usernameField: 'email'},
        (email, password, done) => {
            User.findOne({where: {email: email}})
                .then(user => {
                    if(!user){
                        return done(null, false, {message: 'Incorrect username and password. '});
                    }

                    return user.validPassword(password) ?
                        done(null, user) :
                        done(null, false, {message: 'Incorrect username and password. '});
                })
                .catch(() => done(null, false, {message: 'Incorrect username and password. '}))
        }
    )
)

有所作为


推荐阅读