2015-06-12 19 views
5

Tôi đang cố gắng xác thực người dùng bằng passportjs bằng express.Vượt qua thông tin người dùng trong các tuyến đường từ các chiến lược Hộ chiếu

Passport.js trông giống như thế này.

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

Tôi muốn tất cả các thông tin chiết xuất trong res.json (user_info). Nhưng nó đang trống rỗng. Những gì tôi đang thiếu ở đây. Phương pháp tốt nhất để lưu thông tin cơ bản của người dùng là gì để giữ anh ấy đăng nhập.

Trả lời

4

Thứ nhất, bạn nên không lưu USER_INFO = {} ngoài phạm vi yêu cầu hiện tại của bạn. Nếu hai người dùng riêng biệt thực hiện yêu cầu thì họ sẽ nhận được cùng một đối tượng.

Bạn nên ít nhất lưu trữ chúng trong một cách mà bạn có thể lấy chúng riêng

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

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

Bây giờ nếu hai người dùng riêng biệt tạo ra một yêu cầu họ sẽ có thông tin của họ riêng lưu trữ trong USERS

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

done(null, profile) sẽ serialize người dùng đó. Nếu bạn chưa xác định bạn serialize/deserialize functions bạn nên làm như vậy như thế này:

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

Bây giờ người dùng của bạn sẽ có sẵn trong bối cảnh yêu cầu tương ứng của họ như req.user

Vì vậy, bạn chỉ cần thực hiện:

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

nopes ... nó không bắt biến. –

2

Bạn đã quên gọi được thực hiện() trong process.nextTick().

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

Bạn có thể vượt qua bất kỳ đối tượng để thực hiện (), nó sẽ trở thành req.user sau trong lộ trình của bạn. Trong trường hợp của bạn, USER_INFO mà bạn muốn trả lời là req.user

app.get('/fb', function (req, res) { 
    res.json(req.user); 
}); 
Các vấn đề liên quan