Правила Firestore не собирают пользовательские претензии - PullRequest
0 голосов
/ 26 февраля 2019

Я не могу получить пользовательские претензии для работы в правилах пожарного депо.Я использую nodeJS (локальный) для установки пользовательских утверждений и инициализации с помощью учетной записи службы из firebase.Пользовательский токен автоматически добавляется в заголовки запроса и проверяет штраф на узле.

// Initialize
admin.initializeApp({
credential: admin.credential.cert(serviceAccount as admin.ServiceAccount), // Typing is wrong google!
  databaseURL: `https://${serviceAccount.project_id}.firebaseio.com`
});

// Add custom claims for additional privileges.
const payload = await admin.auth().setCustomUserClaims(decodedToken.sub, { 
customClaims })
  .then(() => ({ ...decodedToken, customClaims }))
  .catch(() => void 0);
if (!payload) { res.status(401).json({ error: 'Error setting custom claims on token' }); return; }

Пользовательский объект утверждений:

// Define custom claims
const customClaims: CustomClaims = {
  serverAuth: true,
  domain: domainOfUser,
  developer: isDeveloper,
  admin: isAdmin,
};

Angular Fire 2: пользователь входит в систему с помощью girect redirect и затем обновляеттокен:

if (!this.firebaseAuth.auth.currentUser) { return Promise.reject('User object not found in fireAuth service'); }
return this.firebaseAuth.auth.currentUser.getIdToken(true);

Когда это все сделано, я делаю: (fireAuthService - это пользовательский сервис, который обрабатывает некоторые вещи аутентификации)

// On user change
this.fireAuthService.user$.pipe(
  map(userAuth => { if (!userAuth) { this.userSource.next(null); } return userAuth; }),
  filter(notNullOrUndefined),
  switchMap(async userAuth => {
    const userDoc = this.userCollection.doc<UserDb>(userAuth.uid);
    const exists = await userDoc.get().toPromise().then(user => user.exists)
      .catch(() => this.fireAuthService.signOut());
    if (!exists) {
      const res = await this.serverService.createNewUser(userAuth).catch(() => void 0);
      if (!res) { this.fireAuthService.signOut(); }
    }
    return userAuth;
  }),
  switchMap(userAuth => this.userCollection.doc<UserDb>(userAuth.uid).valueChanges())
).subscribe(async userDb => {
  await this.fireAuthService.getAuthToken();
  const isAdmin = await this.fireAuthService
    .getTokenPayload()
    .then(payload => (payload.claims.customClaims as CustomClaims).admin);
  this.userSource.next(new CurrentUser(userDb, this.serverService, isAdmin));

  runAngularFire();
});

На полезной нагрузке все мои пользовательские утверждения наэта точка.Вызовы firestore по вызовам user doc firestore обеспечиваются только проверкой uid в правилах firestore, и это работает.

На этом этапе я настроил своих слушателей.Они терпят неудачу с ошибкой:

Отсутствует или недостаточно разрешений.

Правила пожарного хранилища настроены следующим образом:

service cloud.firestore {
  match /databases/{database}/documents {

  // Allow users to read documents in the user's collection
  match /users/{userId} {
    allow read: if request.auth.token.sub == userId;
  }

  // Allow only reads to the db
  match /{document=**} {
    allow read: if request.auth.token.serverAuth == true;
  }
}

Я пробовалпочти все, и я в растерянностиЛюбое предложение?Заранее большое спасибо!

Редактировать: Я также проверил токен, отправленный на канал? Database = ... У этого токена есть пользовательские утверждения ...

1 Ответ

0 голосов
/ 26 февраля 2019

После ночи сна я заметил свою ошибку:

const payload = await admin.auth().setCustomUserClaims(decodedToken.sub, { customClaims });

Кому:

const payload = await admin.auth().setCustomUserClaims(decodedToken.sub, customClaims);

Также я проверил правила на объекте.Объекты, вероятно, не работают в правилах.

...