【问题标题】:How do I send the right data via post request, to satisfy this firebase rulset?如何通过发布请求发送正确的数据,以满足这个 firebase 规则集?
【发布时间】:2021-01-29 10:23:09
【问题描述】:

我真的整天都在为此苦苦挣扎,因此真诚地感谢任何帮助...

目前我有一个带有工作身份验证系统的应用程序。 用户可以将数据添加到 Firebase。用户在每个帖子中添加值。 值是“描述”和“名称”。 我想要实现的是,用户只能看到数据,他自己发布在我的 firebase 上。

因此,我使用的 firebase 中的代码如下所示:

{
  "rules": {
    "notes": {
      "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null"
      }
    }
  }
}

但存储的值具有以下结构: 后端名称 笔记 0 描述:“这个的价值” name: "那个值"

如果我尝试从该数据库中获取数据,我只会收到 401 错误(访问被拒绝)。所以我认为错误是,uid 在此丢失。

我将如何实现这一目标? 我现在想分享部分代码。如果这还不够,我将与您分享所有内容。不过我希望这已经足够了。

相关部分如下:

note.service.ts

private notes: Note[] = [];

  setNotes(notes: Note[]) {
    this.notes = notes;
    this.notesChanged.next(this.notes.slice());
  }

getNotes() {
    return this.notes.slice();
  }

note.model.ts

export class Note {
  public name: string;
  public description: string;


  constructor(name: string, desc: string) {
    this.name = name;
    this.description = desc;
  }
}

data.storage.ts

  loadNotes() {
    return this.http
      .get<Note[]>(
        'https://XXXXXXX.firebaseio.com/notes.json'
      )
      .pipe(
        map(notes => {
          return notes.map(note => {
            return {
              ...note
            };
          });
        }),
        tap(notes => {
          this.noteService.setNotes(notes);
        })
      );
  }

包含名称和描述的表单内容将作为一个值发送到 firebase。结构如上图。

那么你将如何做到这一点?

非常感谢您阅读本文并帮助我!

编辑:我不确定,如果有人读到这个......但无论如何我都会尝试。 我已经收到一个 idToken,将 get 请求更改为广告 idToken,但不知道如何相应地更改 put 请求。

我什至不确定 Firebase 规则是否正常。

【问题讨论】:

  • 你想过使用 angularfire 吗?
  • 此处记录了验证 REST 请求的过程:firebase.google.com/docs/database/rest/auth 不过,我会考虑为您的平台使用 Firebase SDK,因为它可以处理所涉及的许多边缘情况。
  • @FrankvanPuffelen 感谢您的建议。我想我实际上已经快到了……所以我想坚持这一点,因为我已经为此付出了努力。但我无法完成它。真是令人沮丧。
  • @JSmith 我得调查一下。但也许下次。谢谢。

标签: javascript angular firebase firebase-realtime-database


【解决方案1】:

请求被拒绝,因为您的规则规定只有经过身份验证的用户才能访问文档。

您已经说过您有一个有效的身份验证系统,因此 REST 请求工作所需的步骤是弗兰克在上述文档中提到的 auth 令牌。

这个token可以通过getIdToken这个方法获得:

https://firebase.google.com/docs/reference/js/firebase.User#getidtoken

然后你可以像这样插入你的请求:

https://XXXXXXX.firebaseio.com/notes.json?auth=<ID_TOKEN>

【讨论】:

  • 好吧,我相应地编辑了获取请求。但是我应该怎么处理 put 请求呢?我需要以同样的方式编辑它吗?
  • 是的。实际上所有请求都需要添加 ID_TOKEN。它将超时更改并由上面链接中的库生成。
猜你喜欢
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2019-07-06
  • 2020-01-05
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多