2015-06-12 55 views
5

我正嘗試使用express來驗證用戶使用passportjs。從Passport策略路由中傳遞用戶信息

Passport.js看起來像這樣。

var USER_INFO = {}; 
 
var FB_CALLBACK = 'http://localhost:3000/auth/facebook/callback'; 
 
module.exports = function(passport) { 
 
\t passport.use(new FacebookStrategy({ 
 
\t \t clientID: FB_CLIENT_ID, 
 
\t \t clientSecret: FB_CLIENT_SECRET, 
 
\t \t callbackURL: FB_CALLBACK 
 
\t }, 
 
\t function(accessToken, refreshToken, profile, done) { 
 
\t \t process.nextTick(function() { 
 
\t \t \t USER_INFO.id = profile.id; 
 
\t \t }); 
 
\t })); 
 
}

var express = require('express'); // call express 
var app = express(); // define our app using express 
var router = express.Router(); // get an instance of the express Route 
var passport = require('passport'); 
USER_INFO = {}; 
require('./config/passport')(passport); 
app.get('/auth/facebook', passport.authenticate('facebook')); 

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

app.get('/fb', function (req, res) { 
    res.json(USER_INFO); 
}); 

我想在res.json(USER_INFO)中提取的所有信息。但它是空的。我在這裏錯過了什麼。什麼是保存的用戶的用戶基本信息,讓他登錄的最佳方法。

回答

4

首先,你應該USER_INFO = {}您的當前請求的範圍之內。如果兩個單獨的用戶提出請求,則他們將獲得相同的對象。

你至少應該將它們存儲的方式,你可以檢索它們分別

var USERS = {}; 
... 
module.exports... 
passport.use... 
... 

function(accessToken, refreshToken, profile, done) { 
    USERS[profile.id] = profile; 
    done(null, profile); 
})); 

現在,如果兩個不同的用戶提出要求,他們將有自己的信息分別內存儲USERS

{ 
    1234: {id: 1234, name: FOO}, 
    6789: {id: 6789, name: BAR}, 
} 

done(null, profile)serialize該用戶。如果你還沒有定義您的serialize/deserialize functions你應該這樣做是這樣的:

passport.serializeUser(function (user, done) { 
    done(null, user.id); 
}); 
passport.deserializeUser(function (id, done) { 
    var user = USERS[id]; 
    done(null, user); 
}); 

現在,您的用戶將他們各自的要求的上下文中可作爲req.user

所以,你只需要做:

app.get('/fb', function (req, res) { 
    res.json(req.user); 
}); 
+0

nopes ...它不是追趕變量。 –

2

您忘記了在process.nextTick()中調用done()

var FB_CALLBACK = 'http://localhost:3000/auth/facebook/callback'; 
module.exports = function(passport) { 
    passport.use(new FacebookStrategy({ 
     clientID: FB_CLIENT_ID, 
     clientSecret: FB_CLIENT_SECRET, 
     callbackURL: FB_CALLBACK 
    }, 
    function(accessToken, refreshToken, profile, done) { 
     process.nextTick(function() { 
      var USER_INFO = {}; 
      USER_INFO.id = profile.id; 
      done(USER_INFO) 
     }); 
    })); 
} 

您可以傳遞任何對象()完成,它將成爲req.user在你的路線後。在你的情況下,USER_INFO要響應req.user

app.get('/fb', function (req, res) { 
    res.json(req.user); 
});