【问题标题】:Best approach for user input validation?用户输入验证的最佳方法?
【发布时间】:2019-04-29 18:44:46
【问题描述】:

简而言之,我希望在更改用户昵称时在应用中进行事务时从 firebase/firestore 获得有意义的验证错误。

我正在努力寻找一个好的方法。让我通过这个简单的例子来解释:

React Native 中用户个人资料页面的“昵称”TextInput。 用户可以更改“昵称”值并单击保存。 如果昵称字符串有任何问题,则会向用户显示有意义的错误/反馈,例如:昵称太短/太长。昵称包含坏词。昵称已被使用。

我已经通过使用 Cloud Functions 和单击“保存”时应用程序中的 https 调用来完成此操作。这允许我向用户显示任何输入验证错误,因为这是对服务器的正确请求,我可以在其中抛出可以直接向用户显示的错误。但感觉……笨拙?

昵称本身的服务器端验证会检查长度 > 4 && 长度

真的没有更简单的方法吗?以上是最好的方法吗?

如果我能以某种方式在 firestore 规则中抛出错误并在客户端捕获它,然后将其显示给用户,那将很容易 - 然后我可以在 firestore 规则中使用正则表达式等进行所有验证。但我所看到的只是允许和拒绝——它纯粹是基于访问的,所以如果我尝试进行任何验证,用户最终会得到“权限被拒绝”。所以我必须在firestore中执行规则(为了安全),并在客户端编写验证以向用户显示有意义的错误(即客户端不发送任何数据,除非它是有效的)。如果没有客户端验证,它只会在尝试使用 firebase.firestore.doc('users/blahblah').update({nickname: new_value }) 直接更新时抛出“权限被拒绝”错误。

这当然是可行的,但不如让服务器验证并发出错误消息那样灵活 - 节省大量输入 - 如果我以后必须添加更多验证规则,则不需要更新应用程序 - 可以只需在服务器上执行即可。

我只是觉得通过firebase.firestore函数在应用中做一个简单的事务会更优雅,并且能够捕获错误。

我觉得我可能遗漏了一些东西,但我花了两天时间搜索 Google,阅读了所有 firebase + firestore 文档和 react-native-firebase 文档 + 示例。所以我希望这里有人遇到过类似的情况,花几分钟时间来节省一些智慧:)

干杯!

【问题讨论】:

    标签: google-cloud-firestore react-native-firebase


    【解决方案1】:

    所以你想要的是在数据库中实现一个应用程序逻辑。那完全没问题。您的模型(实体)在客户端(用户界面)和服务器端(服务器应用程序)定义了验证规则。

    为了以您想要的方式集中验证,您必须在数据库函数和/或触发器中移动所有规则。这是我永远不会推荐的东西,因为您将以某种方式将应用程序的一个非常重要的部分建立在数据库层中。在这一步之后,您仍然需要将所有错误委托给服务器应用程序层并返回给用户,因为您需要正确授权用户。

    所以回答这个问题 - 是的。这是进行验证的最佳方式 - 在APPLICATION LAYER 内。不用管数据库,那只是一个存储。是的,您可以在那里复制一些规则,但这只是目前的良好做法。

    另一方面,如果您阅读了一些关于数据库设计以及那里的工作原理的书籍,您会发现强烈建议为特定模型插入/更新的对象实施非常严格的规则。

    因此,在阅读完所有内容后,您最终将获得以下验证:

    1. 用户界面
    2. 应用层
    3. 数据库层

    没有一种简单的方法可以在不失去一些灵活性的情况下集中验证。

    【讨论】:

    • 只是为了扩展一点,我只是设法为此制定了一些 Firestore 规则。至少它使它更安全一点,因为您实际上可以使用规则进行值类型检查和简单的字段值验证。例如。确保一个值是一个纪元时间戳等。gist.github.com/bitfabrikken/25d239d41dc7e113b70fd658c7dc063d
    【解决方案2】:

    在设计用户友好界面的这种情况下,错误消息应该通过将它们映射到 HTTP 状态代码来用有意义的消息适当地修饰:

    200 - valid input
    422 - input should meet certain criteria
    

    在您的情况下,一种方法可以是向服务器发送 HTTP 请求(当字符大于 4 时,在每个用户点击时)保持禁用“保存”按钮,直到服务获得最新成功。

    只有在满足以下条件时,云 HTTP 调用才会响应 200 状态:

    • 输入长度 > 4 && 长度
    • 检查用户名的唯一性
    • 检查坏词

    否则,不成功的代码应该从服务器返回(可用于映射,向用户显示用户友好的消息)。 HTTP 代码的映射可以在客户端或服务器端完成。

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多