Firebase 연동으로 회원가입 및 로그인 구현을 하는 도중 다음 에러 발생
Ignoring header X-Firebase-Locale because its value was null.
구글링 해서 나오는 매니패스트 파일에 코드 추가, 애뮬레이터 와이파이 확인, 비밀번호 6자리 이상, 올바른 이메일 형식으로 입력 등 모두 해봤지만 해결되지 않았었다.
나의 에러 상황은 다음과 같다.
class LoginActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginBinding
private lateinit var auth: FirebaseAuth
private var user: FirebaseUser? = null
private lateinit var email: String
private lateinit var password: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
auth = Firebase.auth
setOnClickBtn()
}
private fun setOnClickBtn() {
val btn_login = binding.btnLogin
// 로그인 버튼
btn_login.setOnClickListener {
if (login() == true) {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
}
}
}
// 로그인
private fun login():Boolean {
var loginResult = false
email = binding.etAdress.text.toString()
password = binding.etPassword.text.toString()
if (email.isBlank()) {
Toast.makeText(this,"아이디를 입력해주세요..", Toast.LENGTH_SHORT).show()
} else if (password.isBlank()) {
Toast.makeText(this,"비밀번호를 입력해주세요..", Toast.LENGTH_SHORT).show()
} else {
auth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
Log.d(TAG, "signInWithEmail:success")
user = auth.currentUser
loginResult = true
} else {
Log.w(TAG, "signInWithEmail:failure", task.exception)
Toast.makeText(baseContext, "아이디와 비밀번호를 확인해주세요.", Toast.LENGTH_SHORT).show()
}
}
}
return loginResult
}
}
로그인 실행 함수 내에서 로그인이 성공한 if (task.isSuccessful) 부분 내에서 Activity 전환을 하지 않고,
setOnClickBtn()에서 로그인 함수를 받아 login()이 true를 반환할 때 Activity 전환을 한 것이 문제였다.
파이어베이스 공식 문서의 로그인 구현 예시 코드에서도 if (task.isSuccessful) 내에서 updateUI가 이루어지는 것을 확인할 수 있다.
auth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithEmail:success")
val user = auth.currentUser
updateUI(user)
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithEmail:failure", task.exception)
Toast.makeText(
baseContext,
"Authentication failed.",
Toast.LENGTH_SHORT,
).show()
updateUI(null)
}
}
분명 공식 문서를 참고하며 코드를 작성했는데도 내 멋대로 작성해 이런 에러를 발생시켜 꽤 많은 시간을 에러 해결에 투자했다.
앞으로 구현 시 이런 부분까지도 신경써야겠다.
setOnClickBtn()에서 로그인 버튼 클릭이벤트가 들어오면 login() 함수를 실행시켜 login() 함수 내에서 액티비티 전환까지 이루어지도록 수정했다.
액티비티 전환을 하면서 user 데이터도 함께 넘겨주었다.
setOnClickBtn()에서 로그인 버튼 클릭이벤트 처리만 하는 것 처럼 보여도, 실제 코드에서는 해당 액티비티의 모든 버튼 클릭이벤트를 처리하고 있으므로 login() 함수 내에서 로그인 버튼의 클릭이벤트까지 처리하진 않았다.
class LoginActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginBinding
private lateinit var auth: FirebaseAuth
private var user: FirebaseUser? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
auth = Firebase.auth
setOnClickBtn()
}
private fun setOnClickBtn() {
val btn_login = binding.btnLogin
// 로그인 버튼
btn_login.setOnClickListener {
login()
}
}
// 로그인
private fun login() {
val email = binding.etAdress.text.toString()
val password = binding.etPassword.text.toString()
if (email.isBlank()) {
Toast.makeText(this, "아이디를 입력해주세요.", Toast.LENGTH_SHORT).show()
} else if (password.isBlank()) {
Toast.makeText(this, "비밀번호를 입력해주세요.", Toast.LENGTH_SHORT).show()
} else {
auth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
Log.d("LoginActivity", "signInWithEmail:success")
user = auth.currentUser
val intent = Intent(this, MainActivity::class.java)
intent.putExtra("user", user)
startActivity(intent)
finish()
} else {
Log.w("LoginActivity", "signInWithEmail:failure", task.exception)
Toast.makeText(baseContext, "아이디와 비밀번호를 확인해주세요.", Toast.LENGTH_SHORT).show()
}
}
}
}
}