通过 Passport 策略在路线中传递用户信息

2024-02-19

我正在尝试使用 Passportjs 使用 Express 对用户进行身份验证。

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) 中提取所有信息。但它即将到来。我在这里缺少什么。保存用户基本信息以保持登录状态的最佳方法是什么?


首先,你应该not store 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},
}

And done(null, profile) would serialize那个用户。如果您还没有定义您的序列化/反序列化函数 http://passportjs.org/docs/configure你应该这样做:

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);
}); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 Passport 策略在路线中传递用户信息 的相关文章

随机推荐