С учетной записью службы вы произвольно кодируете доступ к своей базе данных ко всем установленным приложениям, другими словами, все, кто устанавливает ваше приложение, будут видеть то же самое.
Как правило, вы используете подход к токенам, чтобы вы настраивали доступ к различным узлам базы данных для разных пользователей. Это обычно достигается путем установки несколько простых правил для узлов, например:
// 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, а также.