0

我們有本地用戶列表的Android應用程序。該應用程序在Firebase中有單個專用用戶(其他用戶在本地進行管理),應該用於訪問實時數據庫。 UID將用於應用安全規則並限制對特定數據元素的訪問。我認爲我們有兩個選擇:自定義令牌或服務帳戶(使用databaseAuthVariableOverride)。Firebase自定義令牌對服務帳戶

我想知道通過使用服務帳戶方法可能會遇到什麼安全問題?它是否完全訪問?也許我們可以將其限制爲最少的一組操作?

自定義令牌方法可能在令牌到期時出現問題。有沒有一種方法來顯着擴展令牌效度?什麼可能是在android上生成自定義標記的最佳方法?

回答

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", 

      } 
     } 
     } 
    } 

您可以檢查有關如何使用Google+在official documentation權威性的細節,但總體而言,一旦你權威性,你可以得到一個唯一的用戶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"); 
     } 
     // ... 
    } 
}; 
// ... 

對於服務器,它是安全的,讓您的服務帳戶的祕密,你可以開始下面的一個火力地堡連接(注意databaseAuthVariableOverride ?,它匹配我們在messages節點的根上使用的auth.uid)。

firebase.initializeApp({ 
    serviceAccount: "path/to/project-name-secrets.json", 
    databaseURL: "https://project-name.firebaseio.com", 
    databaseAuthVariableOverride: { 
    uid: "server-with-svc-acct" 
    } 
}); 

關於這方面的更多信息也可以在documentation中找到。

相關問題