我正在直接在本教程中运行护照快速快递的基本身份验证策略。
(以下常见的Facebook策略,我实际上使用的是Passport-saml,但是这个问题与所有护照策略有关):
<script>
//1234
function popit(url, pass ) {
var person = prompt("Password?", "...");
if (person == pass) {
window.location.href=url;
}
else {
alert('Invalid');
}
}
</script>
<a href="" onclick="popit('/logs/uploadappointment?option=aaa', '1234');">FAIL - TEST</a>
or
<a href="/logs/uploadappointment?option=aaa">WORK - TEST</a>
我需要编辑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
和添加的req.user
:
profile
如何编辑护照用户对象以使其他个人资料信息可用?
答案 0 :(得分:1)
尝试修改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.session.profile
的任何请求上删除req.user
,以便不保留有关注销用户的过时profile
信息。
app.get("*", function(req, res, next){
if(req.session.profile && !req.user)
delete req.session.profile;
next();
});
所有这些未经测试,但我相信它可能对您有用。
答案 1 :(得分:0)
passport-saml
答案可能适用于其他策略:
profile
将自动保存到用户对象。
诀窍在于,如果用户属性为空,则不保存。 IE:
{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/