parsing服务器Node.js SDK:替代Parse.User.become?

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

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

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

我知道如何validation,然后保持用户的sessionToken,而且在我的研究中看到,比这个问题的“接受”解决scheme是调用Parse.User.disableUnsafeCurrentUser ,然后使用Parse.User.become()来切换当前用户给请求的人。

但是,这感觉hackish,我敢肯定,它迟早会导致竞争条件,当前的用户被切换,然后请求Parse。

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

有两种方法可以从不同的用户请求吗?

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

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

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

 // 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()实际上是为parsing云代码环境devise的,其中每个请求都位于一个沙盒中,并且您可以依靠每个请求的全局当前用户。 这在Node.js应用程序中并没有什么意义,我们可能会弃用它。

我最近写了一个NodeJS应用程序,并有同样的问题。 我发现Parse.User.disableUnsafeCurrentUserParse.User.become()的组合不仅是Parse.User.disableUnsafeCurrentUser ,而且还导致了其他一些我无法预料的问题。 所以这就是我做的:我使用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() ,而且在后端需要特别小心,在没有任何条件的情况下,有人会在未经许可的情况下覆盖数据。