【问题标题】:Pass user info in routes from Passport strategies在 Passport 策略中传递用户信息
【发布时间】:2015-08-28 01:47:41
【问题描述】:

我正在尝试使用 express.passportjs 对用户进行身份验证。

Passport.js 看起来像这样。

var USER_INFO = {};
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() {
			USER_INFO.id = profile.id;
		});
	}));
}
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) 中提取的所有信息。但它是空的。我在这里缺少什么。保存用户基本信息以保持登录状态的最佳方法是什么。

【问题讨论】:

    标签: node.js facebook express passport.js


    【解决方案1】:

    首先,您应该USER_INFO = {} 存储在当前请求范围之外。如果两个不同的用户提出请求,那么他们将获得 same 对象。

    您至少应该以可以单独检索它们

    的方式存储它们
    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);
    }); 
    

    【讨论】:

      【解决方案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)
              });
          }));
      }
      

      您可以将任何对象传递给 done(),稍后它将在您的路由中变为 req.user。在您的情况下,您要响应的 USER_INFOreq.user

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 1970-01-01
        • 2019-01-19
        • 1970-01-01
        • 1970-01-01
        • 2020-08-20
        • 2016-07-21
        相关资源
        最近更新 更多