Parse 无法检索用户电子邮件
Parse can't retrieve user email
我使用的是最新版本的 Parse Server,在发布 .js 文件之前进行了 Typescript 编译。请注意,这整个问题特定于 Cloud Code,而不是客户端实现。
到目前为止,这一直运行良好,但现在我发现了一个我真的不知道如何解决的问题。考虑一个用于处理电子邮件事件的 class,它有一个方法可以找到给定 ID 的用户电子邮件,并向他发送消息:
async sendEmailToUserID(userId: string, subject: string, text: string){
const res = await new Parse.Query("User").equalTo("objectId", userId).find();
if(res){
const user = res[0];
const email = user.get("email");
return await this.sendEmail(email, subject, text);
}
}
我认为这个函数非常简单明了,很容易解释。好吧,事实是,find() 函数可以正确检索用户的对象,但是 .get("email") 永远不会起作用:它总是 returns "undefined".
有人知道为什么会这样吗?
PD:是的,任何给定用户都存在 "email" 字段。
好的,花了一段时间才知道如何找到它,因为 Parse 没有任何专门用于此的错误。问题是我试图在不使用主密钥的情况下访问受保护的 User class 对象。
请注意,以下解决方案仅适用于 Cloud Code;从客户端代码使用它绝对不安全:
只需将 {useMasterKey: true} 添加到 .find() 方法即可:
const res = await new Parse.Query("User").equalTo("objectId", userId).find({useMasterKey: true});
电子邮件是一个敏感字段,在发送给匿名请求的客户端之前会从服务器中删除。
正如您所注意到的,您可以将 'userMasterKey' 添加到客户端查询中,但是您永远不应该这样做,因为 masterKey 是一个秘密,您的解析服务器的整个安全性取决于保密(例如密码)。
在服务器上、在云代码中或在 php 服务器上使用主密钥进行查询是可以的,但是在客户端代码中使用主密钥是绝对不行的(ios, 浏览器中的js, android, 等等)
您可以让经过身份验证的用户可以使用电子邮件和其他敏感字段。这是一个新功能,还没有很好的文档记录,但您可以从测试中看到它是如何使用的:https://github.com/parse-community/parse-server/blob/f2c332ea6a984808ad5b2e3ce34864a20724f72b/spec/UserPII.spec.js#L526
我使用的是最新版本的 Parse Server,在发布 .js 文件之前进行了 Typescript 编译。请注意,这整个问题特定于 Cloud Code,而不是客户端实现。
到目前为止,这一直运行良好,但现在我发现了一个我真的不知道如何解决的问题。考虑一个用于处理电子邮件事件的 class,它有一个方法可以找到给定 ID 的用户电子邮件,并向他发送消息:
async sendEmailToUserID(userId: string, subject: string, text: string){
const res = await new Parse.Query("User").equalTo("objectId", userId).find();
if(res){
const user = res[0];
const email = user.get("email");
return await this.sendEmail(email, subject, text);
}
}
我认为这个函数非常简单明了,很容易解释。好吧,事实是,find() 函数可以正确检索用户的对象,但是 .get("email") 永远不会起作用:它总是 returns "undefined".
有人知道为什么会这样吗?
PD:是的,任何给定用户都存在 "email" 字段。
好的,花了一段时间才知道如何找到它,因为 Parse 没有任何专门用于此的错误。问题是我试图在不使用主密钥的情况下访问受保护的 User class 对象。
请注意,以下解决方案仅适用于 Cloud Code;从客户端代码使用它绝对不安全:
只需将 {useMasterKey: true} 添加到 .find() 方法即可:
const res = await new Parse.Query("User").equalTo("objectId", userId).find({useMasterKey: true});
电子邮件是一个敏感字段,在发送给匿名请求的客户端之前会从服务器中删除。
正如您所注意到的,您可以将 'userMasterKey' 添加到客户端查询中,但是您永远不应该这样做,因为 masterKey 是一个秘密,您的解析服务器的整个安全性取决于保密(例如密码)。
在服务器上、在云代码中或在 php 服务器上使用主密钥进行查询是可以的,但是在客户端代码中使用主密钥是绝对不行的(ios, 浏览器中的js, android, 等等)
您可以让经过身份验证的用户可以使用电子邮件和其他敏感字段。这是一个新功能,还没有很好的文档记录,但您可以从测试中看到它是如何使用的:https://github.com/parse-community/parse-server/blob/f2c332ea6a984808ad5b2e3ce34864a20724f72b/spec/UserPII.spec.js#L526