0

У нас есть приложение для Android с локальным списком пользователей. Приложение имеет одного выделенного пользователя в Firebase (другие пользователи управляются локально), который должен использоваться для доступа к базе данных Realtime. UID будет использоваться для применения правил безопасности и ограничения доступа к конкретным элементам данных. Я думаю, у нас есть два варианта: пользовательский токен или служебная учетная запись (с базой данныхAuthVariableOverride).Пользовательский токен Firebase vs service account

Интересно, какие проблемы безопасности мы можем получить, используя подход учетной записи службы? Получает ли он полный доступ? Может быть, мы могли бы ограничить это минимальным набором действий?

Пользовательский подход к токену может иметь проблему с истечением токена. Есть ли способ значительно продлить срок действия токена? Что может быть лучшим способом создания пользовательского токена на 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, но в общих чертах, как только вы аутентификация, вы можете получить уникальный идентификатор пользователя и, таким образом, записывать требуемый узел в базу данных в реальном времени. Пользователь не будет иметь доступ к любому другому узлу, так как правила будут ограничивать его:

@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" 
    } 
}); 

Более подробную информацию об этом можно найти в documentation, а также.

Смежные вопросы