2017-05-13 1 views
1

私はチュートリアルをしていますが、ログイン領域に詰まっています。私がPassport.jsでログインしているときは、常に "failureRedirect"を認証で実行します。私は問題はボディパーサーに関連することができることを考えていくつかのフォーラムで読んだ後Passport.jsを使用しているログインシステムは常に "failureRedirect"(nodejs)を実行しています

Error: null User: false Info: {"message":"Missing credentials"}

:私は次のメッセージを受け取ったrouter.post(「ログイン」)ルートを交換デバッグしようとした後

。私は問題を解決しようとしてきましたが、私はまだできませんでした。私は経験豊富なnode.jsプログラマーの助けに感謝します。

プロジェクトの構造は以下の通りである: app.js経路: users.jsモデル: user.jsの

user.jsの

var express = require('express'); 
 
var router = express.Router(); 
 
var multer = require('multer'); 
 
var passport = require('passport'); 
 
var LocalStrategy = require('passport-local').Strategy; 
 
var bodyParser = require('body-parser'); 
 

 
var User = require('../models/user'); 
 

 
var upload = multer({ dest: './uploads' }); 
 

 
// create application/json parser 
 
var jsonParser = bodyParser.json(); 
 

 
// create application/x-www-form-urlencoded parser 
 
var urlencodedParser = bodyParser.urlencoded({ extended: false }); 
 

 
/* GET users listing. */ 
 
router.get('/', function(req, res, next) { 
 
    res.send('respond with a resource'); 
 
}); 
 

 
router.get('/register', function(req, res, next) { 
 
    res.render('register', { 
 
    title: 'Register' 
 
    }); 
 
}); 
 

 
router.get('/login', function(req, res, next) { 
 
    res.render('login', { 
 
    'title': 'Login' 
 
    }); 
 
}); 
 

 
router.post('/register', upload.single('profileimage'), function (req, res, next) { 
 
    //Get Form Values 
 
    var name = req.body.name; 
 
    var email = req.body.email; 
 
    var username = req.body.username; 
 
    var password = req.body.password; 
 
    var password2 = req.body.password2; 
 

 

 
    // Check for Image Field 
 
    if(req.files && req.files.profileimage){ 
 
    console.log('Uploading File...'); 
 

 
    // File Info 
 
    var profileImageOriginalName = req.files.profileimage.originalname; 
 
    var profileImageName = req.files.profileimage.name; 
 
    var profileImageMime = req.files.profileimage.mimetype; 
 
    var profileImagePath = req.files.profileimage.path; 
 
    var profileImageExt = req.files.profileimage.extension; 
 
    var profileImageSize = req.files.profileimage.size; 
 
    } else { 
 
    // Set a Default Image 
 
    var profileImageName = 'noimage.png'; 
 
    } 
 

 
    // Form Validation 
 
    req.checkBody('name', 'Name field is required').notEmpty(); 
 
    req.checkBody('email', 'Email field is required').notEmpty(); 
 
    req.checkBody('email', 'Email not valid').isEmail(); 
 
    req.checkBody('username', 'Username field is required').notEmpty(); 
 
    req.checkBody('password', 'Password field is required').notEmpty(); 
 
    req.checkBody('password2', 'Passwords do not match').equals(req.body.password); 
 

 
    // Check for errors 
 
    var errors = req.validationErrors(); 
 

 
    if(errors){ 
 
    res.render('register', { 
 
     errors: errors, 
 
     name: name, 
 
     email: email, 
 
     username: username, 
 
     password: password, 
 
     password2: password2 
 
    }); 
 
    } else { 
 
    var newUser = new User({ 
 
     name: name, 
 
     email: email, 
 
     username: username, 
 
     password: password, 
 
     profileImage: profileImageName 
 
    }); 
 

 
    // Create User 
 
    User.createUser(newUser, function (err, user) { 
 
     if(err) throw err; 
 
     console.log(user); 
 
    }); 
 

 
    //Success Message 
 
    req.flash('success', 'You are now registered and may log in'); 
 

 
    res.location('/'); 
 
    res.redirect('/'); 
 
    } 
 
}); 
 

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

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

 
passport.use(new LocalStrategy(
 
    function (username, password, done) { 
 
    User.getUserByUsername(username, function (err, user) { 
 
     if(err) throw err; 
 
     if(!user){ 
 
     console.log('Unknown User'); 
 
     return done(null, false, {message: 'Unknown User'}); 
 
     } 
 

 
     User.comparePassword(password, user.password, function (err, isMatch) { 
 
     if(err) throw err; 
 
     if(isMatch){ 
 
      return done(null, user); 
 
     } else { 
 
      console.log('Invalid Password'); 
 
      return done(null, false, {message:'Invalid Password'}); 
 
     } 
 
     }); 
 
    }); 
 
    } 
 
)); 
 

 
router.post('/login', jsonParser, passport.authenticate('local', { 
 
    successRedirect: '/', 
 
    failureRedirect: '/users/login', 
 
    failureFlash: true //'Invalid username or password' 
 
}), function (req, res) { 
 
    console.log('Authentication Successful'); 
 
    req.flash('success', 'You are logged in'); 
 
    res.redirect('/'); 
 
}); 
 

 
router.post('/login', passport.authenticate('local', function(err, user, info) { 
 
    console.log("authenticate"); 
 
    console.log(err); 
 
    console.log(user); 
 
    console.log(info); 
 
}), function (req, res) { 
 
    console.log('Authentication Successful'); 
 
    req.flash('success', 'You are logged in'); 
 
    res.redirect('/'); 
 
}); 
 

 
module.exports = router;

ユーザ.js

var mongoose = require('mongoose'); 
 
var bcrypt = require('bcrypt'); 
 

 
mongoose.connect('mongodb://localhost/nodeauth'); 
 

 
var db = mongoose.connection; 
 

 
// User Schema 
 
var UserSchema = mongoose.Schema({ 
 
    username: { 
 
    type: String, 
 
    index: true 
 
    }, 
 
    password: { 
 
    type: String, 
 
    required: true, 
 
    bcrypt: true 
 
    }, 
 
    email: { 
 
    type: String 
 
    }, 
 
    name:{ 
 
    type: String 
 
    }, 
 
    profileimage:{ 
 
    type: String 
 
    } 
 

 
}); 
 

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

 
module.exports.comparePassword = function(candidatePassowrd, hash, callback) { 
 
    bcrypt.compare(candidatePassowrd, hash, function (err, isMatch) { 
 
    if(err) return callback(err); 
 
    callback(null, isMatch); 
 
    }); 
 
} 
 

 
module.exports.getUserById = function (id, callback) { 
 
    User.findById(id, callback); 
 
} 
 

 
module.exports.getUserByUsername = function (username, callback) { 
 
    var query = {username: username}; 
 
    User.findOne(query, callback); 
 
} 
 

 
module.exports.createUser = function (newUser, callback) { 
 
    bcrypt.hash(newUser.password, 10, function (err, hash) { 
 
    if(err) throw err; 
 

 
    // Set hashed pw 
 
    newUser.password = hash; 
 

 
    // Create User 
 
    newUser.save(callback); 
 
    }); 
 
}

app.js

var express = require('express'); 
 
var path = require('path'); 
 
var favicon = require('serve-favicon'); 
 
var logger = require('morgan'); 
 
var expressValidator = require('express-validator'); 
 
var cookieParser = require('cookie-parser'); 
 
var session = require('express-session'); 
 
var passport = require('passport'); 
 
var LocalStrategy = require('passport-local').Strategy; 
 
var bodyParser = require('body-parser'); 
 
var multer = require('multer'); 
 
var flash = require('connect-flash'); 
 
var mongo = require('mongodb'); 
 
var mongoose = require('mongoose'); 
 
var db = mongoose.connection; 
 

 
var routes = require('./routes/index'); 
 
var users = require('./routes/users'); 
 

 
var app = express(); 
 

 
// view engine setup 
 
app.set('views', path.join(__dirname, 'views')); 
 
app.set('view engine', 'jade'); 
 

 
// Handle File Uploads 
 
// app.use(multer({dest:'./uploads'})); 
 
var upload = multer({ dest: './uploads' }); 
 

 
// uncomment after placing your favicon in /public 
 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
 
app.use(logger('dev')); 
 

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

 
// Handle Express Sessions 
 
app.use(session({ 
 
    secret: 'secret', 
 
    saveUninitialized: true, 
 
    resave: true 
 
})); 
 

 
// Passport 
 
app.use(passport.initialize()); 
 
app.use(passport.session()); 
 

 
// Validator 
 
app.use(expressValidator({ 
 
    errorFormatter: function(param, msg, value) { 
 
    var namespace = param.split('.') 
 
     , root = namespace.shift() 
 
     , formParam = root; 
 

 
    while(namespace.length) { 
 
     formParam += '[' + namespace.shift() + ']'; 
 
    } 
 
    return { 
 
     param : formParam, 
 
     msg : msg, 
 
     value : value 
 
    }; 
 
    } 
 
})); 
 
// app.use(expressValidator({ 
 
// errorFormatter 
 
// })); 
 

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

 
app.use(flash()); 
 
app.use(function (req, res, next) { 
 
    res.locals.messages = require('express-messages')(req, res); 
 
    next(); 
 
}); 
 

 
app.use('/', routes); 
 
app.use('/users', users); 
 

 
// catch 404 and forward to error handler 
 
app.use(function(req, res, next) { 
 
    var err = new Error('Not Found'); 
 
    err.status = 404; 
 
    next(err); 
 
}); 
 

 
// error handler 
 
app.use(function(err, req, res, next) { 
 
    // set locals, only providing error in development 
 
    res.locals.message = err.message; 
 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 
 

 
    // render the error page 
 
    res.status(err.status || 500); 
 
    res.render('error'); 
 
}); 
 

 
module.exports = app;

のDropbox上のファイル: https://www.dropbox.com/sh/ex26xxo85lfo0my/AADET-j6Ift0q-y-ecWCRUEba?dl=0

あなたの助けをありがとう:)

+0

私はROUTEでデバッグするために使用されるコードは router.post( '/ログイン'、passport.authenticate( 'ローカル'、機能(errは、ユーザー、情報){ はconsole.log( "認証をusers.js 「); にconsole.log(ERR); にconsole.log(ユーザ); にconsole.log(情報); })、関数(REQ、RES){ はconsole.log( '認証成功'); req.flash( 'success'、 'あなたはログインしています'); res.redirect( '/'); }); – Rafa

答えて

0

最初..コードをモジュール化しようとしてください。さまざまなファイルに機能を追加することで、バグをより早く追跡するのに役立ちます。 2番目の理由は、ログインルートへの2回のPOSTコールですか?最初のものを削除し、jsonParserを送信する必要はありません。あなたはシリアライズとデシリアライズを宣言しました。そうすれば、パスポートは安静を処理します。

+0

こんにちはRajesh、コードはモジュール化されています。ここでは、より詳しく見せるためのコードへのリンクがあります。 https://www.dropbox.com/sh/ex26xxo85lfo0my/AADET-j6Ift0q-y-ecWCRUEba?dl=0 ありがとう – Rafa

+0

申し訳ありませんが、2番目のコメントはコメント欄に記載してください。私はコンソール上の詳細を表示するデバッグしようとしていた – Rafa

1

https://github.com/rupalipemare/Mongoose-Demoのコードを確認してください。パスポート認証を示す完全な例があります。

+0

ありがとうルパリ、それはあなたから非常に親切です:) – Rafa

+0

希望の例があなたを助けた! –

関連する問題