首页 > 解决方案 > 如何通过发布请求发送正确的数据,以满足这个 firebase 规则集?

问题描述

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

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

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

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

但是存储的值具有以下结构: Backend-name notes 0 description:“this 的值” name:“that 的值”

如果我尝试从该数据库中获取数据,我只会收到 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;
  }
}

数据.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规则是否还可以。

标签: javascriptangularfirebasefirebase-realtime-database

解决方案


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

您已经说过您有一个有效的 Auth 系统,因此 REST 请求工作所需的步骤是authFrank 在上面的文档中提到的令牌。

该令牌可通过此方法获得getIdToken

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

然后您可以插入您的请求,例如:

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

推荐阅读