2012-12-11 11 views
13

私はノードエクスプレスサーバーで働くためにパスポートを取得しようとしています。 Facebookでログインして、データベースに正しいユーザーを見つけることができます。しかし、私がリダイレクトするとき、req.userは常に定義されていません。私のサーバーコードは以下の通りです:req.user undefined - node + express + passport-facebook

var express = require('express'), 
path = require('path'), 
http = require('http'), 
passport = require('passport'), 
FacebookStrategy = require('passport-facebook').Strategy, 
user = require('./routes/users'); 


var app = express(); 

passport.use(new FacebookStrategy({ 
    clientID: "HIDDEN", 
    clientSecret: "HIDDEN", 
    callbackURL: "http://MYURL.com/auth/facebook/callback", 
    passReqToCallback: true 
}, 
    function(req, accessToken, refreshToken, profile, done) { 
    user.findOrCreate(profile, function(err, user) {  
     if (err) { return done(err); }  
     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.configure(function() {  
app.set('port', process.env.PORT || 3000); 
    app.use(express.static(path.join(__dirname, 'public'))); 
    app.use(express.logger('dev')); /* 'default', 'short', 'tiny', 'dev' */ 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ secret: 'foobar' })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router);  
}); 

app.get('/auth/user', function (req, res) { 
    console.log(req); 
}); 

app.get('/auth/facebook', passport.authenticate('facebook')); 
app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { successRedirect: '/', 
             failureRedirect: '/login' })); 


http.createServer(app).listen(app.get('port'), function() { 
    console.log("Express server listening on port " + app.get('port')); 
}); 

私は/ auth/facebookに行き、/を/にリダイレクトします。しかし、その後、私は/認証/ユーザーとreq.userに行く未定義で、私のセッションはこれを示す:

cookies: { 'connect.sid': 's:JFdQkihKQQyR4q70q7h2zWFt.VS+te0pT0z/Gtwg7w5B33naCvA/ckKMk60SFenObxUU' }, 
    signedCookies: {}, 
    url: '/auth/user', 
    method: 'GET', 
    sessionStore: 
    { sessions: 
     { '5sk3Txa2vs5sYhvtdYwGaUZx': '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{"user":"50c527c9c6cb41860b000001"}}', 
     'Au6m0hAj/3warKOGNSWw0yu2': '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}', 
     JFdQkihKQQyR4q70q7h2zWFt: '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}' }, 
    generate: [Function], 
    _events: { disconnect: [Function], connect: [Function] } }, 
    sessionID: 'JFdQkihKQQyR4q70q7h2zWFt', 

それは私のセッションIDはパスポートのユーザーが設定されているセッションと一致しないとは何かを持っていますか?

更新

だから私は、セッションIDが一致しないと判断し、私はc9.ioに私のコードを実行しているためであり、それは実際には2つのURLがあります。正しいURLを使用して/ auth/userに行くと、私のsessionIDがpassportユーザーの設定したセッションと一致し、ログにdeserializeuserが正しいユーザーオブジェクトを見つけていることがわかります。ただし、これ以降はreq.userは未定義です。

Trying to find user with id: 50c527c9c6cb41860b000001 
{ sessions: 
    { yoOUOxyXZ0SmutA0t5xUr6nI: '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{"user":"50c527c9c6cb41860b000001"}}', 
    goZpmK3y3tOfn660hRbz2hSa: '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}', 
    'O5Sz1GuZqUO8aOw4Vm/hriuC': '{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}' }, 
    generate: [Function], 
    _events: { disconnect: [Function], connect: [Function] } } 
sessionID: yoOUOxyXZ0SmutA0t5xUr6nI 
req.user: undefined 
{ cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true }, 
    passport: {} } 

アップデート2

私はこの問題を考え出しました。それは私のuser.findByID機能にあった:あなたはそれがuser._id変数が有効な形式であることはなかった更新で述べたよう

exports.findById = function(id, callback) {  
    console.log('Trying to find user with id: ' + id); 
    db.collection('users').findOne({'_id':new BSON.ObjectID(id)}, function(err, user) {   
      callback(err, user); 
    }); 
}; 
+3

別のノート:急行ルートの定義のための用心 - あなたは 'app.get'や他のルートを定義するときには問題ありません。あなたがこのルートの途中でユーザーデータも同様にそうするように、パスポートミドルウェアの前にユーザールートを定義することができます。 (特にあなたのケースではありませんが、非常によく似た症状があります)。 – moka

+2

今すぐ使えますか?答えがあれば投稿してください –

+0

あなたのノードをコピーしてJSHint http://www.jshint.comに貼り付けるのが便利なツールです。JSHintにあなたのコードを見せてもらうために、やっかいなタスクを実行することもできます。 –

答えて

1

exports.findById = function(id, callback) {  
    console.log('Trying to find user with id: ' + id); 
    db.collection('users').findOne({'_id':id}, function(err, user) {   
      callback(err, user); 
    }); 
}; 

に変更しました。これを避け、後で他のリクエストやメソッドでこのフォーマットを処理しなければならない場合は、サインアップ時に新しいユーザーIDを生成するようアドバイスします。

あなたは、このモジュールを使用することができます。

node-uuid

var uuid = require('node-uuid'); 

function findOrCreate(profile, callback) { 
    // save new profile 
    profile.uid = uuid.v1().replace(/\-/g, ''); 
} 
関連する問題