自动登录用户到 Apostrophe

Auto login users to Apostrophe

我扩展了 apostrophe-express 模块实现逻辑以检查请求 headers 中的 cookie。此检查中的一种情况是自动登录用户。如果 cookie key/val 与预设标志值匹配,那么我想在 aposUsersSafe collection 中查找用户(基于电子邮件地址),如果用户存在于 collection,自动将他签入cms。

目前,我已经通过 运行 基于电子邮件的 mongo 用户查询实现了用户查找:

var collection = db.collection('aposUsersSafe');

    collection.find({email: email}).toArray(function (err, result) {
      if (err) {
        deferred.reject(new Error(error));
      } else if (result.length) {
        deferred.resolve(result);
      } else {
        console.log('User not found');
      }

但我看到 apostrophe-login 模块提供了通过护照进行身份验证和权限的方法。扩展 apostrophe-login 和 passport 是实现这个自动登录解决方案的方法吗?谢谢!

正如我在回答您之前的问题时提到的,我是 P'unk Avenue 的 Apostrophe 的首席建筑师。

在我们的演示项目中实际上有一个完整的自动登录实现,借用的时机已经成熟(:我们想自动让用户登录,这样人们在看到用户界面之前就不会放弃。

它很短,所以在这里:

module.exports = {
  construct: function(self, options) {
    self.pageBeforeSend = function(req, callback) {
      if (!req.cookies.demo_autologin) {
        return self.apos.users.find(req, { username: 'admin' }).permission(false).toObject(function(err, user) {
          if (err) {
            return callback(err);
          }
          if (!user) {
            return callback(null);
          }
          req.login(user, function(err) {
            if (err) {
              return callback(err);
            }
            // Start a whole new request, but logged in. After this they
            // have the cookie so they can log out and back in normally if they want
            req.res.cookie('demo_autologin', 1);
            return req.res.redirect('/');
          });
        });
      }
      return callback(null);
    };
  }
};

当然,您需要在 app.js 中启用 demo-autologin 模块,方法是将其包含在 modules 属性 中。

此模块的工作原理如下:

  1. 它提供了一个 pageBeforeSend 方法,该方法在页面发送到浏览器之前被调用。

  2. 它检查 demo_autologin cookie 是否已经设置。

  3. 如果不是,则通过apostrophe-users模块的find方法提供的游标找到admin用户,使用permission(false)绕过通常会限制可以找到的内容的权限检查。

  4. 它调用 req.login,这是 passport 提供的一种方法,它确实使以编程方式登录用户变得非常容易。

  5. 通过req.res.cookie设置cookie。 res 对象总是可以从 req 访问,反之亦然。在 Apostrophe 中,通常只传递 req,因为 req.res 可用,而且在大多数情况下,您将向 req 添加更多数据,而不是直接响应。

  6. 它重定向到主页,以便整个页面加载为登录体验。

自然地,您会根据与 "just make everybody admin," 不同的标准来决定寻找哪个用户,但听起来您已经掌握了这一部分,并且此代码应该很容易适应您的需求。

(我突然想到,如果用户甚至拒绝接受一个普通的旧会话 cookie,此代码可能会遇到重定向循环。无论如何,常规登录将无法正常工作,但如果你愿意,你可以跟踪通过查询字符串的情况,并告诉用户如果他们两次到达这里就启用 cookie。)

此答案已更正为包括 findreq 参数。