私はこの質問を既に見てきました。しかし、私は多くの答えを読んだが、彼らは助けていない。私はログインフォームで何をしていても、「MISSING CREDENTIALS」エラーを表示し続けます。私は電子メールとパスワードを使用してユーザーのログインを実装しようとしています。セッションのオプションとすべてが素敵なもの -Passport jsとmongoDBのユーザーログイン
マイルートファイル
const express = require('express');
const router = express.Router();
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user');
passport.use(new LocalStrategy((email, password, done) => {
User.getUserByEmail(email, (err, user) => {
if(err) throw err;
if(!user) {
return done(null, false, {message: 'this account does not exist'});
}
User.comparePassword(password, user.password, (err, isMatch) => {
if(err) throw err;
if(isMatch) {
return done(null, user);
}
else {
return done(null, false, {message: 'oops! wrong password! try again'});
}
});
});
}));
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.getUserById(id, (err, user) => {
done(err, user);
});
});
router.post('/', (req, res, next) => {
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/toSignInPage',
failureFlash: true
})(req, res, next);
});
module.exports = router;
user.jsのは
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const bcrypt = require('bcryptjs');
const UserSchema = new Schema({
email: {
type: String,
required: true,
trim: true
},
name: {
type: String,
required: true,
unique: true,
trim: true
},
password: {
type: String,
required: true,
trim: true
},
profilePhoto: {
originalemail: String,
imagePath: String
},
token: String
});
const User = module.exports = mongoose.model('User', UserSchema);
module.exports.registerUser = function(newUser, callback) {
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(newUser.password, salt, (err, hash) => {
if(err) {
console.log(err);
}
newUser.password = hash;
newUser.save(callback);
});
});
};
module.exports.getUserByEmail = function(email, callback) {
const query = {
email: email
};
User.findOne(query, callback);
};
module.exports.getUserById = function(id, callback) {
User.findById(id, callback);
};
module.exports.comparePassword = function(candidatePassword, hash, callback) {
bcrypt.compare(candidatePassword, hash, (err, isMatch) => {
if(err) throw err;
callback(null, isMatch);
});
};
私は初期化されてきた私のapp.jsファイルにパスポートを提出します。フォーム
<form method="post" action="/signInPage">
<label for="mail"> Email </label>
<input type="email" id="mail" name="email" />
<label for="password"> Password</label>
<input type="password" id="password" name="password"/>
<button type="submit">Sign in</button>
<p class="corp"> <a href="forgot.html">Forgot password?</a> </p>
</form>
にも
私のhtml(ハンドル)は、すべてのヘルプは、この上で認識されます。私はしばらくの間デバッグをしていましたが、何が間違っていなければならないのか分からないようです。理解できない形式で質問を適切にフォーマットしなかった場合は、私に知らせてください。
は、私は、サーバー上のフォームのPOSTアクションが表示されません。私はそれを逃していますか?さらに、ユーザーが見つからない場合やパスワードが間違っている場合には、違う方法でユーザーに返答しないでください。ハッキングが簡単になります。 – Paul
お返事ありがとうございました。ポストアクションは実際にはsignup.jsというフォルダに定義されているルートを '/ signup'しています。サイドノートのおかげで、私はそれを実装することを確認します。 –