我无法在Firestore规则中使用自定义声明。 我正在使用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:用户使用Google重定向登录,然后刷新令牌:
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规则中的uid可以保护用户doc firestore调用上的firestore调用,这是可行的。
在这一点上,我设置了我的听众。他们失败并显示错误:
权限不足或权限不足。
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;
}
}
我几乎尝试了所有事情,但我很茫然。有什么建议吗? 提前非常感谢!
编辑:我还检查了通道上发送的令牌吗?数据库= ...该令牌具有自定义声明...
答案 0 :(得分:0)
经过一夜的睡眠,我注意到了我的错误:
$('#messages').append('<Li class="self"><div class="message"><div class="content" lang="fa">' + Message_Text + '</div></div></Li >');
收件人:
const payload = await admin.auth().setCustomUserClaims(decodedToken.sub, { customClaims });
我也确实测试了对象上的规则。对象可能无法在规则中工作。