我正在使用Passport.js来登录我的Node-App。但是在我的应用程序中,我需要访问用户的ID,目前我还不知道如何实现这个功能!
我如何访问用户ID,或者我应该自己将其发送到cookie中?
答案 0 :(得分:22)
您应该在应用中引入以下代码,旁边是策略配置:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
通过这种方式,当您使用经过身份验证的用户调用done
函数时,passport会负责将userId存储在cookie中。
每当您想要访问userId时,您都可以在请求正文中找到它。 (快递req["user"]
)。
如果要在会话中存储其他数据,还可以开发serializeUser
函数。我是这样做的:
passport.serializeUser(function(user, done) {
done(null, {
id: user["id"],
userName: user["userName"],
email: user["email"]
});
});
您可以在此处找到更多信息:http://passportjs.org/docs/configure
答案 1 :(得分:18)
添加到登录路径
res.cookie('userid', user.id, { maxAge: 2592000000 }); // Expires in one month
添加退出路径
res.clearCookie('userid');
答案 2 :(得分:1)
如果您使用的是angular-fullstack
生成器,我就是这样修改setUserCookie
以获取用户Cookie中的_id
的方法(之后我可以在AngularJS中检索)。
setUserCookie: function(req, res, next) {
if (req.user) {
req.user.userInfo['_id'] = req.user._id;
console.log('Cookie', req.user.userInfo);
// Splice in _id in cookie
var userObjWithID = {
"provider": req.user.userInfo.provider,
"role": req.user.userInfo.role,
"name": req.user.userInfo.name,
"_id": req.user._id
};
res.cookie('user', JSON.stringify(userObjWithID));
}
next();
}
答案 3 :(得分:0)
或者您可以执行以下操作:
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.use((req, res, next) => {
res.locals.login = req.isAuthenticated();
res.locals.thisUser = req.user;
next();
});
答案 4 :(得分:0)
answer by user1071182 是正确的,但没有说明 cookie 设置代码的位置。
这是一个更完整的例子:
app.get("/auth/google/callback",
passport.authenticate("google"),
setUserIDResponseCookie,
(req, res, next)=>{
// if success
if (req.user) {
res.redirect("http://localhost:3000");
} else {
res.redirect("http://localhost:3000/login-failed");
}
next();
});
function setUserIDResponseCookie(req, res, next) {
// if user-id cookie is out of date, update it
if (req.user?.id != req.cookies["myapp-userid"]) {
// if user successfully signed in, store user-id in cookie
if (req.user) {
res.cookie("myapp-userid", req.user.id, {
// expire in year 9999 (from: https://stackoverflow.com/a/28289961)
expires: new Date(253402300000000),
httpOnly: false, // allows JS code to access it
});
} else {
res.clearCookie("myapp-userid");
}
}
next();
}
注意:请确保:
authXXX/callback
路由,而不是 authXXX
路由。passport.authenticate
,即。没有重定向选项。如果您在那里设置重定向选项,cookie 将无法正确设置(据我所知)。相反,在设置 cookie 后添加自定义重定向代码。 (如上图)