我想完全将我的客户端应用程序与Parse服务器分离,以便在将来轻松切换到其他Baas /自定义后端。因此,所有客户端请求都将指向node.js服务器,该服务器将代表用户向Parse发出请求。
Client <--> Node.js Server <--> Parse Server
因此,我需要node.js服务器能够在用户之间切换,以便我可以保持其身份验证的上下文。
我知道如何验证,然后保留用户的sessionToken,我在研究期间看到的问题比“接受”解决这个问题的方法是调用Parse.User.disableUnsafeCurrentUser
,然后使用Parse.User.become()
来将当前用户切换到发出请求的用户。
但是这感觉很乱,而且我很确定它迟早会导致竞争状态,当前用户在请求解析之前就会被切换。
我发现的另一个解决方案是不关心Parse.User,并使用masterKey来保存服务器的所有内容,但这会使服务器负责ACL。
除了两个用户之外,有没有办法向不同的用户发出请求?
答案 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.disableUnsafeCurrentUser
和Parse.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()
,并且需要在后端特别注意,如果有人在未经许可的情况下覆盖数据,则不会出现任何情况。