用户列表最佳实践的 Firebase 规则?
Firebase rules for user list best practice?
不知何故,我仍然对 firebase 规则有理解上的问题,需要你们的一些意见。
假设我有一个包含所有用户的用户节点。每个用户都包含电子邮件、姓名、phone 等子节点。
我的基本 firebase 规则现在规定只有具有正确 ID 的用户才能 edit/write/read 在他自己的节点中。这一切都很好。但是现在我确实遇到了其他用户搜索朋友的情况,因为我需要在所有用户中搜索姓名或电子邮件,但是因为我的规则不允许读取用户数据,除非用户是他的所有者自己的数据 我不知道如何解决这个问题。我无法使用规则为每个经过身份验证的用户授予其他用户数据的读取权限,但我仍然想在其他用户数据中搜索电子邮件地址等示例。这让我很困惑。
我唯一能想到的是 运行 将一个完整的分隔列表与类似 public 的信息并列,并保持每个人都可以在该列表中读取(不能写入)的规则。但是我又遇到了一个问题,如果我将他们放在 public 列表中,那么有人可以轻松访问我的整个用户列表(例如电子邮件)。
如果有人能指出我正确的方向,我会很高兴。我不知道从哪里开始正确地设置它。
执行此类操作的最佳方法是什么?
嘿,我不是专业人士,也不是 Firebase 的附属机构。但是由于我遇到过相同类型的问题,所以我与您分享我的想法。
- 我不认为允许用户基于存储在 Firebase 节点中的电子邮件并直接从客户端搜索其他人是完全安全的。基于诸如 userName 之类的东西进行搜索是可以的,因为它适用于您的应用程序。
- 如果必须,那么我会使用 Firebase 函数将其分为两步(您可以在其中放置另一层安全检查,也没有用户直接从数据库读取)或引入其他所有需要的参数传递成功的查询。类似于临时唯一 ID,过一段时间就会过期。
- 如果您仍然想共享电子邮件,您可以将用户的敏感信息存储在一个单独的节点中,并且只将您真正需要向其他人公开的内容保存在 public 节点中,该节点仍然可以有一些安全规则保护它形成未登录的人的访问,例如,您通过 UID 映射电子邮件。
一些想法。
编辑
您可以为用户提供一种能够通过用户名搜索其他用户的方式(例如类似于 instagram。)并且在 firebase 中您只需将每个用户名与其 UID 相关联。这样人们就可以通过用户名找到彼此。想象一下在 firebase 中(你可以对电子邮件做同样的事情,所以发出请求的人需要知道一封电子邮件才能获得 UID,而不是其他方式):
user_names:{
alice_d: UID,
bob_ross: UID,
....
}
您稍后可以搜索任何用户名而不暴露其他人,只需在您的查询中使用 .equalTo() 或 运行 通过 FireStore 进行更复杂的查询(我也是新手)或使用搜索系统已经像 Algolia 一样将您的数据编入索引。
如果您的应用获得批准,Facebook 会提供更多信息,例如好友列表,因此您始终可以使用该列表来推荐好友,前提是用户已通过 Facebook O'auth 登录并且您的应用具有查看好友列表的特权。
请参阅 here 了解如何验证在 Firebase 函数中发出 https 请求的用户。在您的函数中,您可以进行搜索,并且只有 return 安全返回给客户端的内容。 (请记住速度可能是个问题,除非您的功能经常 运行ning)。为了从客户端发出请求,你需要做这样的事情。
_makeRequest: function() {
this.user.getIdToken().then(function(token) {
//token is a long string JWT token used to identify the user to a Firebase service.
var req = new XMLHttpRequest();
req.onload = function() {
/*you return the result in your function*/
if (JSON.parse(req.responseText).rslt === "SUCCESS") {
}
}.bind(this);
req.onerror = function() {
}.bind(this);
/*attaching location key*/
req.open('GET', 'https://us-central1-rest-of-function-address-found-in-
firebase-functions', true);
req.setRequestHeader('Authorization', 'Bearer ' + token);
req.send();
}
您还可以通过向数据库写入内容并具有 运行 onCreate() 函数来实现此目的,如果您需要有关 Firebase functions 的更多信息,请参阅此处。希望这可以帮助。
如果您想允许任何用户通过他们的电子邮件地址找到任何其他用户,这意味着用户必须能够读取电子邮件地址。如果您不希望他们能够阅读完整的配置文件,您需要设置一个额外的数据结构,将电子邮件地址映射到 UID:
emails: {
"theeben@domain,com": "uid5601401",
"puf@theotherdomain,com": "uid209103"
}
使用此结构,您仅会公开电子邮件地址。
但说实话,这仍然暴露了所有用户的一些信息。现在,我会考虑使用 Cloud Functions for Firebase 来实现搜索。这样你的 API 就是一个 function findUser(email): uid
类型的函数,只暴露最少的信息。
不知何故,我仍然对 firebase 规则有理解上的问题,需要你们的一些意见。
假设我有一个包含所有用户的用户节点。每个用户都包含电子邮件、姓名、phone 等子节点。
我的基本 firebase 规则现在规定只有具有正确 ID 的用户才能 edit/write/read 在他自己的节点中。这一切都很好。但是现在我确实遇到了其他用户搜索朋友的情况,因为我需要在所有用户中搜索姓名或电子邮件,但是因为我的规则不允许读取用户数据,除非用户是他的所有者自己的数据 我不知道如何解决这个问题。我无法使用规则为每个经过身份验证的用户授予其他用户数据的读取权限,但我仍然想在其他用户数据中搜索电子邮件地址等示例。这让我很困惑。
我唯一能想到的是 运行 将一个完整的分隔列表与类似 public 的信息并列,并保持每个人都可以在该列表中读取(不能写入)的规则。但是我又遇到了一个问题,如果我将他们放在 public 列表中,那么有人可以轻松访问我的整个用户列表(例如电子邮件)。
如果有人能指出我正确的方向,我会很高兴。我不知道从哪里开始正确地设置它。
执行此类操作的最佳方法是什么?
嘿,我不是专业人士,也不是 Firebase 的附属机构。但是由于我遇到过相同类型的问题,所以我与您分享我的想法。
- 我不认为允许用户基于存储在 Firebase 节点中的电子邮件并直接从客户端搜索其他人是完全安全的。基于诸如 userName 之类的东西进行搜索是可以的,因为它适用于您的应用程序。
- 如果必须,那么我会使用 Firebase 函数将其分为两步(您可以在其中放置另一层安全检查,也没有用户直接从数据库读取)或引入其他所有需要的参数传递成功的查询。类似于临时唯一 ID,过一段时间就会过期。
- 如果您仍然想共享电子邮件,您可以将用户的敏感信息存储在一个单独的节点中,并且只将您真正需要向其他人公开的内容保存在 public 节点中,该节点仍然可以有一些安全规则保护它形成未登录的人的访问,例如,您通过 UID 映射电子邮件。
一些想法。
编辑
您可以为用户提供一种能够通过用户名搜索其他用户的方式(例如类似于 instagram。)并且在 firebase 中您只需将每个用户名与其 UID 相关联。这样人们就可以通过用户名找到彼此。想象一下在 firebase 中(你可以对电子邮件做同样的事情,所以发出请求的人需要知道一封电子邮件才能获得 UID,而不是其他方式):
user_names:{ alice_d: UID, bob_ross: UID, .... }
您稍后可以搜索任何用户名而不暴露其他人,只需在您的查询中使用 .equalTo() 或 运行 通过 FireStore 进行更复杂的查询(我也是新手)或使用搜索系统已经像 Algolia 一样将您的数据编入索引。
如果您的应用获得批准,Facebook 会提供更多信息,例如好友列表,因此您始终可以使用该列表来推荐好友,前提是用户已通过 Facebook O'auth 登录并且您的应用具有查看好友列表的特权。
请参阅 here 了解如何验证在 Firebase 函数中发出 https 请求的用户。在您的函数中,您可以进行搜索,并且只有 return 安全返回给客户端的内容。 (请记住速度可能是个问题,除非您的功能经常 运行ning)。为了从客户端发出请求,你需要做这样的事情。
_makeRequest: function() { this.user.getIdToken().then(function(token) { //token is a long string JWT token used to identify the user to a Firebase service. var req = new XMLHttpRequest(); req.onload = function() { /*you return the result in your function*/ if (JSON.parse(req.responseText).rslt === "SUCCESS") { } }.bind(this); req.onerror = function() { }.bind(this); /*attaching location key*/ req.open('GET', 'https://us-central1-rest-of-function-address-found-in- firebase-functions', true); req.setRequestHeader('Authorization', 'Bearer ' + token); req.send();
}
您还可以通过向数据库写入内容并具有 运行 onCreate() 函数来实现此目的,如果您需要有关 Firebase functions 的更多信息,请参阅此处。希望这可以帮助。
如果您想允许任何用户通过他们的电子邮件地址找到任何其他用户,这意味着用户必须能够读取电子邮件地址。如果您不希望他们能够阅读完整的配置文件,您需要设置一个额外的数据结构,将电子邮件地址映射到 UID:
emails: {
"theeben@domain,com": "uid5601401",
"puf@theotherdomain,com": "uid209103"
}
使用此结构,您仅会公开电子邮件地址。
但说实话,这仍然暴露了所有用户的一些信息。现在,我会考虑使用 Cloud Functions for Firebase 来实现搜索。这样你的 API 就是一个 function findUser(email): uid
类型的函数,只暴露最少的信息。