2012-11-26 3 views
13

を持っていません:)のNode.jsとパスポートオブジェクトはので、私と我慢してください、私はNode.jsの中に合計初心者ですので、予めご了承ください何の方法validPassword

私はNode.jsの+エクスプレス3 +パスポートを使用しています簡易認証(ローカル)を作成するためには、単に周り

と私は時に間違ったユーザー名またはパスワードが入力されたユーザーはエラーページ

にリダイレクトされますが、ユーザーが正しいに入ったときにことをこれまでに達した再生しますユーザー名とパスワードこのエラーが発生する

node_modules\mongoose\lib\utils.js:435 
    throw err; 
     ^
TypeError: Object { _id: 50b347decfd61ab9e9e6768f, 
username: 'saleh', 
password: '123456' } has no method 'validPassword' 
ルート/ login.js

var mongoose = require('mongoose'); 
var db = mongoose.createConnection('localhost', 'authTest'); 

var authSchema = mongoose.Schema({ 
    username: 'string', 
    password: 'string' 
}); 

var User = db.model('users', authSchema); 

exports.index = function(req, res){ 
User.find(function (err, list) { 
     res.render('login', { title: 'Usernames and Passwords', users: list,msg:""}); 
    }); 
}; 

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

    app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'ejs'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 



var mongoose = require('mongoose'); 
var db = mongoose.createConnection('localhost', 'authTest'); 

var authSchema = mongoose.Schema({ 
    username: 'string', 
    password: 'string' 
}); 

var User = db.model('users', authSchema); 


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); 
    }); 
    } 
)); 



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

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




app.post('/login', 
    passport.authenticate('local', { successRedirect: '/', 
            failureRedirect: '/login/error', 

            }) 
); 

と今:私は間違って

app.js(私は不要なコードを削除)だかわからないんだけど

お時間をありがとう。

答えて

11

これは明らかですね。

if (!user.validPassword(password)) { 
    return done(null, false, { message: 'Incorrect password.' }); 
} 

ただし、validPasswordメソッドを定義していません。自分のスキーマにそれを添付:

var authSchema = mongoose.Schema({ 
    username: 'string', 
    password: 'string' 
}); 
authSchema.methods.validPassword = function(pwd) { 
    // EXAMPLE CODE! 
    return (this.password === pwd); 
}; 

EDITあなたはまた、誤ってスキーマを定義した。それは次のようになります。あなたは私が何を意味するか知っていれば両方usernamepasswordは、Stringタイプのオブジェクトではなく、文字列"string"でなければなりません

var authSchema = mongoose.Schema({ 
    username: String, 
    password: String 
}); 

注意。あなたは彼が別の(単純な)例があるパスポートのjs githubのページで...ジャレッドはそれを実装する方法に言及しなかったpassportjsウェブサイトから

を例をコピーしたように:)

+0

感謝:)あなたは..あなたは、Node.jsのより良い学ぶために私に本や任意のリソースをお勧めすることができます可能性がある場合、それは今 –

+0

もう一つの問題に動作しますか? –

+1

@MuhammadSaleh私はNode.JS本を知らない。私は絶えずグーグルですべてを学んだ。 [Node.JSメインページ](http://nodejs.org/)のチュートリアルから始めてください。それからちょうどGoogle。 Stackoverflowは知識の素晴らしいソースです。それは私がそれを学んだ方法です。 – freakish

11

が見えます。彼は完全にvalidPasswordメソッド(18行目)を削除:私はそれの上に(暗号化を使用して)に私のアプリをベースとするものだ

Example

if (user.password != password) { return cb(null, false); } 

+0

ありがとう私は本当に簡単な例が必要でした。また、私はJaredと連絡を取り、より良い文書を作成しました:) –

4

また、これでnoobであり、この1つを把握するのに一日掛かっていました。私は、Jaredのサンプルアプリケーションの別の1つからの履歴と、ここの人々からの暗号のアドバイスを使用しました。

私はsalt(文字列化された大きな乱数)を生成し、saltとユーザーのパスワードを使ってハッシュを作成し(nodejsのcrypto 'モジュールの助けを借りて)、最後にmongooseが新しいアカウントを保存する前に毎回saltとhashの両方を保存します。

//make hash 
userSchema.pre('save', function(next) { 
    var user = this; 
    if(!user.isModified('password')) return next(); 
    var rand = (Math.floor(Math.random() * 1000000000)).toString(36); 
    var hash = crypto.createHash('md5').update(user.password + rand).digest("hex"); 
    user.password = hash; 
    user.salt = rand; 
    next(); 
}); 

確認のために、私は入力されたパスワード(ログイン時)を受け取り、塩を使用して同じハッシュを再度試みます。次に、格納されたハッシュを新しいものと比較し、それに応じて真または偽を返します。

// Password verification 
    userSchema.methods.validPassword = function(password) { 
     var testhash = crypto.createHash('md5').update(password + this.salt).digest("hex"); 
     if(testhash === this.password) { 
     return true; 
     } else { 
     return false; 
     } 
    } 
+0

これを知った瞬間は1年です。 – Rorschach120

+0

それは大丈夫です:)寄付いただきありがとうございます –

関連する問題