规则中不存在request.auth.token.email

时间:2019-09-10 11:49:56

标签: firebase google-cloud-firestore firebase-authentication firebase-security

我们的应用程序使用Firebase作为后端数据库。 Firebase使用Google作为唯一的提供程序为我们的应用程序提供身份验证。身份验证工作正常。身份验证结果中显示“成功”。我想更改我的Firebase规则,以便只有集合中存在的用户才能访问数据。为此,我在firebase中有规则来控制对数据的访问。当我使用request.auth中的任何变量时,这些规则不起作用(与模拟器中的变量相同)

以下规则适用于应用程序和模拟器:

match /restaurants/{$rId}/addresses/{document=**} {
    allow read, write : if get(/databases/$(database)/documents/users/abc@gmail.com).data.restaurantId == $rId;
}

以下规则不适用于应用程序,但可以在模拟器中使用

match /restaurants/{$rId}/addresses/{document=**} {
    allow read, write : if get(/databases/$(database)/documents/users/$(request.auth.token.email)).data.restaurantId == $rId;
}

我正在从应用程序发送身份验证请求,如下所示:

private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
}

处理以下身份验证结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
             Toast.makeText(MyApplication.getAppContext(), "Login Successfull", Toast.LENGTH_LONG);
         }
    }
}

我的firebase数据库包含以下结构

用户:

/users
   abc@gmail.com
            -restaurantId: "1" 

餐馆:

/restaurants
   1
          addresses
                 local
                     -name: a
                 international
                     -name: b 

   2
          addresses
                 local
                     -name: c
                 international
                     -name: d 
   3
          addresses
                 local
                     -name: e
                 international
                     -name: f


当用户尝试使用有效密码登录时,我能够看到Toast“登录成功”。

我应该将身份验证结果保存在onActivityResult中,以便进一步的请求中包含request.auth.token.email吗? Kinldy请指导我。 有人可以让我知道我做错了什么吗?

0 个答案:

没有答案