Я не могу получить пользовательские претензии для работы в правилах пожарного депо.Я использую 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 = ... У этого токена есть пользовательские утверждения ...