Firebase自定义令牌与服务帐户

时间:2016-07-07 15:36:03

标签: android firebase firebase-realtime-database firebase-authentication firebase-security

我们有Android应用程序与本地用户列表。该应用程序在Firebase中有单个专用用户(其他用户在本地管理),应该用于访问实时数据库。 UID将用于应用安全规则并限制对特定数据元素的访问。我认为我们有两个选择:自定义令牌或服务帐户(带有databaseAuthVariableOverride)。

我想知道使用服务帐户方法可能会带来哪些安全问题?它是否可以完全访问?也许我们可以将其限制在最小的行动范围内?

自定义令牌方法可能在令牌过期时出现问题。有没有办法显着扩展令牌有效性?什么是在android上生成自定义令牌的最佳方法?

1 个答案:

答案 0 :(得分:0)

使用服务帐户,您可以对所有已安装的应用程序的数据库进行硬编码访问,换句话说,安装应用程序的每个人都会看到完全相同的内容。

您通常会使用令牌方法,因此您可以将数据库中不同节点的访问权限定制到不同的用户。这通常通过为节点设置一些简单规则来实现,例如:

    // Sample firebase rules
    {
      "rules": {
        "messages": {
          // Only admin servers with service accounts should r/w here
          ".read": "auth.uid == 'server-with-svc-acct'",
          ".write": "auth.uid == 'server-with-svc-acct'",
          "$user_id": {
             // Users can only read their own nodes
             ".read": "auth.uid == $user_id",
             ".write": "auth.uid ==  $user_id",

          }
        }
      }
    }

您可以在official documentation中查看有关如何使用Google+进行身份验证的详细信息,但一般而言,您可以获得唯一的用户ID,然后在实时数据库中写入所需的节点。用户将无法访问任何其他节点,因为规则将限制他:

@Override
protected void onCreate(Bundle savedInstanceState) {
  mAuthListener = new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth){
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) {
            // User is signed in
            Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
        } else {
            // User is signed out
            Log.d(TAG, "onAuthStateChanged:signed_out");
        }
        // ...
    }
};
// ... 

对于您的服务器,可以安全地保护您的服务帐户机密,您可以通过以下方式启动Firebase连接(请注意databaseAuthVariableOverride ?,它与我们在auth.uid上使用的messages相匹配firebase.initializeApp({ serviceAccount: "path/to/project-name-secrets.json", databaseURL: "https://project-name.firebaseio.com", databaseAuthVariableOverride: { uid: "server-with-svc-acct" } }); 节点的根。

{{1}}

有关此内容的更多信息也可以在documentation中找到。