我正在使用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);
passport.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上查看完整的代码。
答案 0 :(得分:0)
您可以检查是否更改此内容吗?
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. '}))
}
)
)
有所作为