解析服务器Node.js SDK:Parse.User.become的替代方案?

时间:2016-06-22 08:59:44

标签: javascript node.js parse-server

我想完全将我的客户端应用程序与Parse服务器分离,以便在将来轻松切换到其他Baas /自定义后端。因此,所有客户端请求都将指向node.js服务器,该服务器将代表用户向Parse发出请求。

Client <--> Node.js Server <--> Parse Server

因此,我需要node.js服务器能够在用户之间切换,以便我可以保持其身份验证的上下文。

我知道如何验证,然后保留用户的sessionToken,我在研究期间看到的问题比“接受”解决这个问题的方法是调用Parse.User.disableUnsafeCurrentUser,然后使用Parse.User.become()来将当前用户切换到发出请求的用户。

但是这感觉很乱,而且我很确定它迟早会导致竞争状态,当前用户在请求解析之前就会被切换。

我发现的另一个解决方案是不关心Parse.User,并使用masterKey来保存服务器的所有内容,但这会使服务器负责ACL。

除了两个用户之外,有没有办法向不同的用户发出请求?

2 个答案:

答案 0 :(得分:2)

对后端(query.find()object.save()等)的任何请求都会使用可选的options参数作为最终参数。这允许您指定额外的权限级别,例如强制主密钥或使用特定的会话令牌。

如果您有会话令牌,您的服务器代码可以代表该用户发出请求,保留ACL权限。

假设您有一个Item个对象表,我们依赖ACL来确保用户只能检索自己的项目。以下代码将使用显式会话令牌,并仅返回用户可以看到的项目:

// fetch items visible to the user associate with `token`
fetchItems(token) {
  new Parse.Query('Item')
    .find({ sessionToken: token })
    .then((results) => {
      // do something with the items
    });
}

become()实际上是为Parse Cloud Code环境设计的,其中每个请求都存在于沙箱中,您可以依赖每个请求的全局当前用户。它在Node.js应用程序中确实没有意义,我们可能会弃用它。

答案 1 :(得分:0)

我最近编写了一个NodeJS应用程序并遇到了同样的问题。我发现Parse.User.disableUnsafeCurrentUserParse.User.become()的组合不仅是hackish,而且还引起了一些我无法预料到的其他问题。 所以这就是我所做的:我用过   Parse.Cloud.useMasterKey();然后按会话ID加载当前用户,就像它是常规用户对象一样。它看起来像这样:

module.exports = function(req, res, next) {
  var Parse = req.app.locals.parse, query;
  res.locals.parse = Parse;
  if (req.session.userid === undefined) {
    res.locals.user = undefined;
    return next();
  }
  Parse.Cloud.useMasterKey();
  query = new Parse.Query(Parse.User); 
  query.equalTo("objectId", req.session.userid);
  query.first().then(function(result) {
    res.locals.user = result;
    return next();
  }, function(err) {
    res.locals.user = undefined;
    console.error("error recovering user " + req.session.userid);
    return next();
  });

};

显然可以优化此代码,但您可以看到一般的想法。好处:它有效!缺点:不再使用Parse.User.current(),并且需要在后端特别注意,如果有人在未经许可的情况下覆盖数据,则不会出现任何情况。