正在编辑 req.user 个对象
Editing req.user object
我是运行直接出教程的express for passport的基本认证策略。
(Facebook策略如下所示,因为它很常见,我实际上使用的是passport-saml,但这个问题涉及所有护照策略):
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "/auth/facebook/callback"
},
function(accessToken, refreshToken, profile, cb) {
//HOW DO I ATTACH THE profile OBJECT HERE TO THE PASSPORT USER?
//OR IS THERE ANOTHER WAY TO SAVE profile FOR LATER? (without using a database)
return cb(null, profile);
}
));
我需要编辑 req.user
对象,并附加来自护照回调的 profile
对象。这将使用户会话具有用户特定的配置文件数据。
然后我将在身份验证中间件中使用添加了 profile
的 req.user
:
//MIDDLEWARE TO CHECK IF USER IS LOGGED IN
function authUser(req, res, next) {
if (req.user) {
//I WANT TO HAVE THE profile AVAILABLE HERE
next();
} else {
res.redirect('/');
}
}
如何编辑通行证用户对象以获得额外的个人资料信息?
尝试修改 req.user
似乎不是最好的做法(如果它能奏效的话)。我相信 req.user
应该始终与您数据库中的用户相同。
但是,您可以使用 passReqToCallback
在 Passport 回调中使用 req,并相应地设置 req.session
。
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "/auth/facebook/callback",
passReqToCallback: true
},
function(req, accessToken, refreshToken, profile, cb) {
req.session.profile = profile;
return cb(null, profile);
}
));
然后您应该记得在任何未定义 req.user
的请求中删除 req.session.profile
,以免保留已注销用户的过时 profile
信息。
app.get("*", function(req, res, next){
if(req.session.profile && !req.user)
delete req.session.profile;
next();
});
所有这些都未经测试,但我相信它对你有用。
passport-saml
可能适用于其他策略的答案:
profile
会自动保存到用户对象。
诀窍在于,如果用户属性为空,则不会保存。即:
{nameId:'russHanneman', sessionId: undefined}
sessionId 不会进入用户对象。如果您需要调整用户 cookie 使其与返回的 profile
不同,您可以在序列化时这样做:
passport.serializeUser(function(user, done) {
done(null, {
id: "custom value",
nameId: user["userName"],
email: user["email"]
});
});
在护照中配置和序列化:
http://www.passportjs.org/docs/configure/
我是运行直接出教程的express for passport的基本认证策略。
(Facebook策略如下所示,因为它很常见,我实际上使用的是passport-saml,但这个问题涉及所有护照策略):
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "/auth/facebook/callback"
},
function(accessToken, refreshToken, profile, cb) {
//HOW DO I ATTACH THE profile OBJECT HERE TO THE PASSPORT USER?
//OR IS THERE ANOTHER WAY TO SAVE profile FOR LATER? (without using a database)
return cb(null, profile);
}
));
我需要编辑 req.user
对象,并附加来自护照回调的 profile
对象。这将使用户会话具有用户特定的配置文件数据。
然后我将在身份验证中间件中使用添加了 profile
的 req.user
:
//MIDDLEWARE TO CHECK IF USER IS LOGGED IN
function authUser(req, res, next) {
if (req.user) {
//I WANT TO HAVE THE profile AVAILABLE HERE
next();
} else {
res.redirect('/');
}
}
如何编辑通行证用户对象以获得额外的个人资料信息?
尝试修改 req.user
似乎不是最好的做法(如果它能奏效的话)。我相信 req.user
应该始终与您数据库中的用户相同。
但是,您可以使用 passReqToCallback
在 Passport 回调中使用 req,并相应地设置 req.session
。
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "/auth/facebook/callback",
passReqToCallback: true
},
function(req, accessToken, refreshToken, profile, cb) {
req.session.profile = profile;
return cb(null, profile);
}
));
然后您应该记得在任何未定义 req.user
的请求中删除 req.session.profile
,以免保留已注销用户的过时 profile
信息。
app.get("*", function(req, res, next){
if(req.session.profile && !req.user)
delete req.session.profile;
next();
});
所有这些都未经测试,但我相信它对你有用。
passport-saml
可能适用于其他策略的答案:
profile
会自动保存到用户对象。
诀窍在于,如果用户属性为空,则不会保存。即:
{nameId:'russHanneman', sessionId: undefined}
sessionId 不会进入用户对象。如果您需要调整用户 cookie 使其与返回的 profile
不同,您可以在序列化时这样做:
passport.serializeUser(function(user, done) {
done(null, {
id: "custom value",
nameId: user["userName"],
email: user["email"]
});
});
在护照中配置和序列化: http://www.passportjs.org/docs/configure/