2016-01-08 16 views
13

が呼び出されました。シリアライズとデシリアライズが呼び出されたときに、私はalert(user.id)を入れましたが、何も起こっていません。 シリアライズとデシリアライズ時にパスポートjs

  • どのような役割をここで私は、例えば、複数のフォームの値を送信する場合、コールバック関数、すなわち、function(req, email, password, done)を呼び出す方法
  • process.nextTick()を果たしuserオブジェクトがpassport.serializeUser(function(user, done){...に受けたから

    • は、私はいくつかのクエリを持っています(名前、電子メール、パスワード、住所、モバイル)。ここで

    コードです: - あなたがユーザーを認証する際

    //config/passport.js 
    
    var LocalStrategy = require('passport-local').Strategy; 
    
    var User   = require('../app/models/user'); 
    
    module.exports = function(passport) { 
    
        passport.serializeUser(function(user, done) { 
         alert(user.id);//// Here is my testing alert 
         done(null, user.id); 
        }); 
    
        passport.deserializeUser(function(id, done) { 
         User.findById(id, function(err, user) { 
          done(err, user); 
         }); 
        }); 
    
    
    passport.use('local-signup', new LocalStrategy({ 
         usernameField : 'email', 
         passwordField : 'password', 
         passReqToCallback : true 
        }, 
        function(req, email, password, done) { 
         process.nextTick(function() { 
         User.findOne({ 'local.email' : email }, function(err, user) { 
    
          if (err) 
           return done(err); 
    
          if (user) { 
           return done(null, false, req.flash('signupMessage', 'That email is already taken.')); 
          } else { 
           var newUser   = new User(); 
           newUser.local.email = email; 
           newUser.local.password = newUser.generateHash(password); 
           newUser.save(function(err) { 
            if (err) 
             throw err; 
            return done(null, newUser); 
           }); 
          } 
    
         });  
    
         }); 
    
        })); 
    } 
    
  • 答えて

    13

    プロジェクトにPassport.jsを使用することについての知識に基づいて、私は可能な限り回答を試みます。

    まず第一に、あなたはブラウザの事で、あなたのalert(...)の名前を変更する必要がありますので、nodejsでalert()のようなもの(機能)は、存在しない、console.log(...)

    のようなものを私はとてもあなたのapp.jsファイルを見ることができません私はパスポートを使った経験に基づいて質問に答えるつもりです。あなたはapp.jsで、次のしていると仮定すると

    (順序が重要である、hereを参照してください)

    var passport = require('passport'); 
    // express-session configs here 
    // following is invoked on each request. 
    app.use(passport.initialize()); 
    

    passport.initialize()passport.session()リクエストごとに呼び出され、彼らはreq.userするためのユーザーIDをロードするためにserializeUserを引き起こすものですされていますシリアル化されたユーザーがサーバー内に見つかった場合(mongodbを使用している場合、ユーザーがmongodbに存在する場合)

    passport.session()は最初serializeUserによってreq.userにロードされ、req.userにおけるユーザの詳細情報を格納したuser._idを使用してMongoDBのを照会し、各要求にdeserializeUserを呼び出します。

    process.nextTick()は、イベントループの周りを次回通過するまでコールバックの実行を延期します。データベースクエリは本質的に同期であり、process.nextTick()は非同期にします。これについてのチュートリアルがたくさんありますが、それはGoogleです。

    先に述べたように、それぞれのご要望に応じてapp.use(passport.session())実行deserializeUser(基本的にすべての要求 - あなたも、静的なファイルをロードする要求のために、その後passport.session()後に急行静的パスのconfigsをリストしている場合)。私の場合、特定のルートでの認証が必要でした。ユーザーが安全なパスにアクセスしたときにのみ、deserializeUserなどの認証が必要でした。したがって、パスが特定のパターンと一致する場合にのみpassport.session()を呼び出す条件を設定する必要がありました:

    app.use(function(req, res, next){ 
        if(req.url.match('/xxxx/secure')) 
        passport.session()(req, res, next) 
        else 
        next(); // do not invoke passport 
    }); 
    

    app.use(passport.session())を上記のものに置き換えます。ユーザーが安全なパスにアクセスした場合にのみ、serializeUserdeserializeUserを含むパスポートプロセスが呼び出されます。上記が完璧な解決策であるかどうかはわかりませんが、ユーザーのためにmongodbの不要なクエリ(deserializeUser)を減らすのに大いに役立ちます。

    最終ポイントで何を求めているのかよく分かりません。ローカル認証とソーシャル認証の両方にパスポートを実装する方法を示すチュートリアルがあります。あなたは周りを見ている必要があります。

    sessionは、ユーザーがロードされている方法の詳細については興味深い事実MORE READING

    、このSO questionで私の答えをお読みください。 Expressは何を表していますか?何がPassportJSですか?ワークフローを簡単に理解することができます(ドキュメンテーションは混乱して曖昧になります)。

    +0

    「passport.initialize()とpassport.session()」という質問があります。シリアライズされたユーザーが見つかった場合、serializeUserが** user idをreq.userにロードさせるものですサーバー内で(wheユーザーがmongodbに存在する場合は、mongodbを使用します)。 ** "ユーザーIDはどこから来たのですか?"ユーザーがmongodbに存在するかどうか "と言うと、Userモデルを自動的に調べますか? –

    +0

    コードリファクタを' if(req.url.match( '/ xxx '))passport.session(); next(); ' – NERDYLIZARD

    0

    シリアル化が起こる:

    app.post('/login', 
        passport.authenticate('local'), 
         function(req, res) { 
         // If this function gets called, authentication was successful. 
         // `req.user` contains the authenticated user. 
         res.redirect('/users/' + req.user.username); 
    }); 
    

    それは上記といないように見える場合は突出してご確認くださいあなたの中にこのコードを見つけてください。以下のようになります。

    passport.authenticate('local', { session: false }) 
    

    プロジェクト使用セッション。公式ドキュメントのSessionsを参照してください。

    3

    あなたの第三のポイントは、コールバック関数に私の理解あたりとして

    function(req, email, password, done), if send multiple form values e.g(name,email,password,address,mobile). 
    

    を呼び出す方法を

    で、4番目の引数は、バックfunction.youは次のように使うとエラーに

    function(req, email, password, mobile, address, done) 
    
    を投げることができない呼び出しとして取り
    関連する問題