읽기 규칙을 수정해야 한다.
사용자를 식별할 필요가 없으므로 로그인은 필요 없다. 앱을 통해서 접속했다면 모든 사용자를 허용하는 걸로 바꾸고 싶다....만 찾아보니 그렇게는 힘든 것 같았다.
그래서 찾은 방법이 익명 로그인.
{
"rules": {
".read": "auth != null",
".write": false
}
}
import androidx.annotation.NonNull;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.AuthResult;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
...
protected void onCreate(Bundle savedInstanceState) {
...
// Firebase 익명 로그인
mAuth = FirebaseAuth.getInstance(); // Firebase Auth 초기화
FirebaseUser user = mAuth.getCurrentUser();
if(user == null) { // 아직 계정 생성 안 된 사용자
signInAnonymously(); // 계정 생성
}
// DB 연결 후 key 값 읽어와서 화면에 출력
FirebaseApp.initializeApp(this);
...
mReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
...
// 데이터 읽어와서 화면에 출력하는 부분
...
System.out.println("정상: DB 연결 성공");
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("에러: DB 연결 실패");
}
});
}
private void signInAnonymously() { // 익명 계정 생성
mAuth.signInAnonymously().addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
System.out.println("정상: 익명 로그인 성공");
} else {
System.out.println("에러: 익명 로그인 실패");
}
}
});
}
여기서 // DB 연결 후 key 값 읽어와서 화면에 출력
이 부분은 참고를 위해 넣은 것으로, (익명 로그인 작업 전에 작성한) DB 읽어오는 게시글 내용이다.
그런데 log를 보니
첫 실행 후 "에러: DB 연결 실패"
/ "정상: 익명 로그인 성공"
이렇게 출력됐다.
두번째 실행부터는 "정상: DB 연결 성공"
이렇게 출력됐다.
이렇게 되는 이유는 잘 모르겠지만 재시작하면 잘 동작하는 듯 하니, TextView의 초기text에 안내문구를 넣었다. ("설치 후 첫 사용이시군요. 앱을 재시작해주시면 정상 작동됩니다."
)
앱 삭제 후 재설치 시 새로운 계정으로 로그인하게 되면서 이전 계정은 유령 계정이 되는데, 이렇게 안 쓰는 익명계정을 삭제하는 방법은 아직 공부 중이다.
원래 익명 로그인이 이렇게 내내 쓰는 게 아니라 잠깐 쓰라고 만든 기능인 것 같기도 하다. firebase에 만든 지 30일 된 익명 계정은 자동으로 삭제해주는 서비스(아마 유료?)가 있고, 공식 문서에도 익명 계정에서 제대로 회원가입한 계정으로 넘어가는 내용이 있는 걸 보면.