首页 > 解决方案 > 服务器端验证逻辑

问题描述

我正在创建某种测验,我向用户提出问题,她需要回答这些问题,如果所有问题都正确回答,我想显示一条成功消息,其中包含在哪里获得奖励的说明。

我的应用程序是一个 Angular-Firebase-Application(Progressive Web App,PWA),完全用 TypeScript 编写。服务器端是带有 FireStore 数据库的 Firebase 托管 Web 应用程序。

因为“客户是邪恶的”,我不想同时将正确答案(和成功消息)下载到客户端并在客户端检查用户答案的​​有效性 - 我宁愿将用户的答案发送到服务器,它会检查它们并且只有在正确的情况下才会发回成功消息。

这是如何在firebase中完成的?

旁注:我的用户没有以任何形式登录,因此是完全匿名的。

标签: firebase

解决方案


如果您使用 Firebase 的数据库(实时数据库或 Firestore)之一来存储答案,则可以使用安全规则来保护对服务器上数据的访问。如果答案是写入的(而不是多项选择),那么您可以结合这两个来实现用例。

实时数据库中的数据结构示例可能是:

{
  Question: "What is NoRyb's user ID on Stack Overflow?"
  Answer: {
    "1288552": "Yes indeed. NoRyb's user ID is 1288552!"
  }
}

如果我们随后使用以下规则保护对此的访问:

{
  "rules": {
    ".read": false,
    "Question": {
      ".read": true
    },
    "Answer": {
      "$id": {
        ".read": true
      }
    }
  }
}

使用这些规则:

  • 每个用户都可以阅读问题。
  • 没有人可以读取Answer节点本身。
  • 为了能够阅读答案,您必须知道它的键 ( "1288552")。

这个方案有很多变化,包括允许用户在正确答案下写下他们的 UID 时增加他们的分数。限制通常是您愿意花费多少精力,以及您愿意更改数据结构以适应仅使用客户端代码的用例。


不相关:为了能够在不要求他们登录的情况下识别您的用户,请查看 Firebase 的匿名身份验证


推荐阅读