Firestore规则未处理自定义声明

时间:2019-02-25 23:23:19

标签: node.js angular firebase-authentication google-cloud-firestore firebase-security-rules

我无法在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;
  }
}

我几乎尝试了所有事情,但我很茫然。有什么建议吗? 提前非常感谢!

编辑:我还检查了通道上发送的令牌吗?数据库= ...该令牌具有自定义声明...

1 个答案:

答案 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 });

我也确实测试了对象上的规则。对象可能无法在规则中工作。