如何使用 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-fullstackgenerator,这就是我修改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?

验证 Passport.js 中的访问权限/组

在不同情况下使用 Passport.js 更改和保存重定向

无法使用 Passport.js 和 Express 4 访问 req.user

通过设置 cookie 使用 Phantom.Js 打开受密码保护的站点 (Passport.js)

passport.js 中的多个模型