如何使用 Passport.js 访问 Cookie 集
Posted
技术标签:
【中文标题】如何使用 Passport.js 访问 Cookie 集【英文标题】:How to access Cookie set with Passport.js 【发布时间】:2012-08-28 20:04:22 【问题描述】:我正在使用 Passport.js 来实现登录到我的 Node-App。但是在我的应用程序中,我需要访问用户的 ID,目前,我不知道如何实现这个功能!
我如何访问用户 ID 或者我应该自己在 cookie 中发送它?
【问题讨论】:
【参考方案1】:您应该在您的应用中,在策略配置旁边引入以下代码:
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
【讨论】:
我的代码已经有了这个 - 但我需要使用 javascript 在客户端访问 cookie - 这可能吗? 对不起,我没有从你的问题中理解这一点。我刚刚分析了我的 node.js 应用程序中的 cookie,但没有看到 passportjs 设置的 cookie。 Connect 只是使用 sessionId 设置一个 cookie。其余数据存储在服务器上。我相信你应该手动设置一个包含所需数据的 cookie,然后在客户端使用 javascript 解析它。 (使用快递:link)。 我已经自己设置了一个 cookie 解决了这个问题,但感谢您的信息! 这将在会话中设置用户 ID 而不是在 cookie 中。 不回答这个问题,现在未来的读者会感到困惑。看来海报是自己解决的。【参考方案2】:添加到登录路径
res.cookie('userid', user.id, maxAge: 2592000000 ); // Expires in one month
添加到退出路径
res.clearCookie('userid');
【讨论】:
我认为,问题是如何将其与护照集成,因为在护照回调和策略中,我们可能无法访问 req/res。 我应该在哪里添加此代码?我的意思是我应该从哪里设置 cookie?【参考方案3】: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://***.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 后添加自定义重定向代码。 (如上图)
如果您有“退出”路由,请将上面的处理程序也添加到该路由。
【讨论】:
【参考方案4】:如果您使用angular-fullstack
generator,这就是我修改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();
【讨论】:
【参考方案5】:或者,您可以执行以下操作:
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.use((req, res, next) =>
res.locals.login = req.isAuthenticated();
res.locals.thisUser = req.user;
next();
);
【讨论】:
以上是关于如何使用 Passport.js 访问 Cookie 集的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Passport.js 和 Express 4 访问 req.user