【问题标题】:Firestore rules work in simulator but failed when reading documents from angular appFirestore 规则在模拟器中工作,但在从 Angular 应用程序读取文档时失败
【发布时间】:2021-09-13 02:43:49
【问题描述】:

所有规则在模拟器中都可以正常工作,但不能通过应用程序。我一直在关注 YouTube 频道 Fireship 在 google 上使用自定义数据 angluar here 登录的视频。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
  }
}

我的身份验证服务

@Injectable({ providedIn: 'root' })
export class AuthService {

  user$: Observable<User>;

  constructor(
    private ngAuth: AngularFireAuth,
    private firestore: AngularFirestore,
  ) { 
    this.user$ = this.ngAuth.authState.pipe(
      switchMap(user => user ? this.userRef(user).valueChanges() : of(null)),
    );
  }

  private userRef({ uid }): AngularFirestoreDocument {
    return this.firestore.doc<User>(`users/${uid}`);
  }
}

在html中使用

<img *ngIf="auth.user$ | async as user" [src]="user.photoURL" alt="user">

【问题讨论】:

    标签: javascript angular google-cloud-firestore firebase-security


    【解决方案1】:

    您正在将user 对象传递给userRef。尝试修改参数。

                  :
          switchMap(user => user ? this.userRef(user.uid).valueChanges() : 
                  :
    
      private userRef(uid: string): AngularFirestoreDocument {
        return this.firestore.doc<User>(`users/${uid}`);
      }
    

    【讨论】:

    • 仍然无法正常工作,我认为这是 Firebase 规则的更多问题。但无法弄清楚规则中有什么问题。
    • console.log(uid); 添加到userRef 并检查uid 是否正确。
    • 是的,它是正确的,规则在 Firestore 模拟器中运行良好,但在应用程序中却没有
    • 尝试使用设置为开发模式的 Firestore 规则(例如 allow read, write: if true)测试您的应用。这将告诉您代码是否正确或是否符合规则。
    【解决方案2】:

    对于任何提出这个问题的人,错误是在 firebase SDK 中。 2021 年 7 月 1 日,firebase 团队发布了新的 firebase sdk v8.7.0,修复了该问题

    release notes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 2019-10-15
      • 1970-01-01
      相关资源
      最近更新 更多