解析服务器 Node.js SDK:替代 Parse.User.become?
Parse Server Node.js SDK: Alternative to Parse.User.become?
我想将我的客户端应用程序与 Parse 服务器完全分离,以便将来轻松切换到其他 Baas/custom 后端。因此,所有客户端请求都将指向 node.js 服务器,该服务器将代表用户向 Parse 发出请求。
Client <--> Node.js Server <--> Parse Server
因此,我需要 node.js 服务器能够在用户之间切换,这样我就可以保留他们的身份验证上下文。
我知道如何进行身份验证,然后保留用户的 sessionToken,我在研究过程中发现 "accepted" 解决此问题的方法是调用 Parse.User.disableUnsafeCurrentUser
,然后使用 Parse.User.become()
将当前用户切换到发出请求的用户。
但这感觉很老套,我敢肯定它迟早会导致竞争条件,即在向 Parse 发出请求之前切换当前用户。
我找到的另一个解决方案是不关心 Parse.User,并使用 masterKey 由服务器保存所有内容,但这会使服务器负责 ACL。
有没有办法从这两个以外的不同用户发出请求?
我最近写了一个 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()
,并且需要在后端特别注意不要出现有人未经许可覆盖数据的情况。
对后端(query.find()
、object.save()
等)的任何请求都采用可选的 options
参数作为最终参数。这使您可以指定额外的权限级别,例如强制使用主密钥或使用特定的会话令牌。
如果您有会话令牌,您的服务器代码可以代表该用户发出请求,同时保留 ACL 权限。
假设您有 table 个 Item
个对象,我们依靠 ACL 来确保用户只能检索他自己的项目。以下代码将使用显式会话令牌,并且仅 return 用户可以看到的项目:
// 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 应用程序中没有真正意义,我们可能会弃用它。
我想将我的客户端应用程序与 Parse 服务器完全分离,以便将来轻松切换到其他 Baas/custom 后端。因此,所有客户端请求都将指向 node.js 服务器,该服务器将代表用户向 Parse 发出请求。
Client <--> Node.js Server <--> Parse Server
因此,我需要 node.js 服务器能够在用户之间切换,这样我就可以保留他们的身份验证上下文。
我知道如何进行身份验证,然后保留用户的 sessionToken,我在研究过程中发现 "accepted" 解决此问题的方法是调用 Parse.User.disableUnsafeCurrentUser
,然后使用 Parse.User.become()
将当前用户切换到发出请求的用户。
但这感觉很老套,我敢肯定它迟早会导致竞争条件,即在向 Parse 发出请求之前切换当前用户。
我找到的另一个解决方案是不关心 Parse.User,并使用 masterKey 由服务器保存所有内容,但这会使服务器负责 ACL。
有没有办法从这两个以外的不同用户发出请求?
我最近写了一个 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()
,并且需要在后端特别注意不要出现有人未经许可覆盖数据的情况。
对后端(query.find()
、object.save()
等)的任何请求都采用可选的 options
参数作为最终参数。这使您可以指定额外的权限级别,例如强制使用主密钥或使用特定的会话令牌。
如果您有会话令牌,您的服务器代码可以代表该用户发出请求,同时保留 ACL 权限。
假设您有 table 个 Item
个对象,我们依靠 ACL 来确保用户只能检索他自己的项目。以下代码将使用显式会话令牌,并且仅 return 用户可以看到的项目:
// 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 应用程序中没有真正意义,我们可能会弃用它。