2016-04-07 15 views
1

passport-local-mongooseを使用して、/ registerフォームにPOSTを送信した後にユーザーを認証しようとしています。 私はいつも「無許可」になる理由を理解できません&データベース上にデータが奇妙に送信されていません(app.post( "/ register")から "passport.authenticate( 'local')を削除すると動作します)
Passport-local-mongoose:登録後にユーザーを認証します

任意のアイデア


app.js:

// ====== Dependencies 
var express = require('express'); 
    bodyParser = require('body-parser'); 
    validator = require('express-validator'); 
    cookieParser = require('cookie-parser'); 
    expressSession = require('express-session'); 
    passport = require('passport'); 
    LocalStrategy = require('passport-local').Strategy; 
    auth = require('./controllers/auth'); 
    registration = require('./controllers/register'); 
    User = require('./models/user'); 
// ====== Options 
var app = express() 
.use(bodyParser.urlencoded({ extended: false })) 
.use(bodyParser.json()) 
.use(validator()) 
.set('view engine','ejs') 
.use(express.static("views")) 
.use(cookieParser()) 
.use(expressSession({ 
    secret : 'soooosecret', 
    resave : true, 
    saveUninitialized : false 
})) 
.use(passport.initialize()) 
.use(passport.session()); 
passport.use(new LocalStrategy(User.authenticate())); 
passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 

    app.post('/register', passport.authenticate('local'), registration.reg); 

app.listen(8080); 
console.log('Server running at 8080'); 

register.js:

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

var reg = function (req, res) { 

    /* some form validation... */ 
    var errors = req.validationErrors(); 

    if (errors) { 
     res.render("register" , { errors : errors }); 
    } 
    else { 
     var newUser = new User({ 
      username : username, 
      password : password, 
      email : email, 
      tel : tel, 
      country : country 
     }); 

     User.createUser(newUser); 
    } 

} 
module.exports = { reg : reg } 

user.jsの:

var mongoose = require('mongoose'); 
    mongoose.connect('mongodb://localhost/mvpem'); 

var passportLocalMongoose = require('passport-local-mongoose'); 

var db = mongoose.connection; 

var Schema = mongoose.Schema; 

var UserSchema = new Schema({ 
    username : String, 
    password  : String, 
    email  : String, 
    tel  : Number, 
    country : String 
}); 

UserSchema.plugin(passportLocalMongoose); 

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

module.exports.createUser = function(newUser) { 
    newUser.save(); 
} 

答えて

2

レジスタを呼び出すことにより、ユーザーをあなたの登録https://github.com/saintedlama/passport-local-mongoose でパスポートローカル・マングースのAPIドキュメントによると(ユーザー、パスワード、CB)

だからあなたregister.jsこの

ようになるはずです
... 

if (errors) { 
    res.render("register" , { errors : errors }); 
} 
else { 
    var newUser = new User({ 
     username : username, 
     email : email, 
     tel : tel, 
     country : country 
    }); 

    User.register(newUser, password, function(err, user) { 
     if (errors) { 
      // handle the error 
     } 
     passport.authenticate("local")(req, res, function() { 
      // redirect user or do whatever you want 
     }); 
    }); 
} 

とパスポートローカル・マングースとregister.js

+0

こんにちは、私はメールアドレス、アドレスとユーザーのいくつかの他の詳細を保存したいので、私はすることができます他の部分で言及した方法をオブジェクト内に使用して、それをUser.registerで使用すると動作しますか?そして、新しいユーザーを作成するよりも、他の方法があります。 – Kannan

+0

@ kannan私はあなたの質問を理解しているか分からない。上記のコードスニペットには、ユーザー名、電子メール、電話番号、国の4つのデータが格納されています。必要なデータを保存することができます。ユーザーモデルで定義する必要があります。これは、 'var User = require( '../ models/user');'という行でインポートされ、register.jsに格納されます。以前の4つのデータと同じようにユーザーを作成します。私はこれが助けて欲しい –

+0

私は現在同じことをしており、私のコードはあなたの例にかなり似ています。しかし、登録が成功すると、MongoDBのユーザレコードにユーザ名とハッシュだけが保存されます。どのように私は実際にこの追加データをユーザーモデルからDBに保存し、このデータにどのようにアクセスできますか? –

0

パスポートの設定が正しく設定されていないようです。あなたはそれがであなたをログインしてもらうために、成功と失敗を処理する方法をパスポートに指示する必要があり

ドキュメントから。 (メインファイルにインポートするconfig.jsファイルを作成します)。

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy, 
    , User = require('../models/user'); 

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

でパスポートを必要とすることを忘れないでください、あなたは実際に戦略だけリクを設定e OPにはそれがあります。 http://mherman.org/blog/2013/11/11/user-authentication-with-passport-dot-js/#.Vx2GVTcrKUk – N1mr0d

関連する問題