테스트 중인 대쉬보드앱의 플로우는 다음과 같다.
- 로고 스플래쉬 UI
- 로그인 UI
- 회원가입 UI
- 메인 UI
- 프로필 UI
- 로그인 UI
로그인 시스템을 Firebase Auth를 사용해 구현하였다.
물론 Firebase Auth- Google Cloud를 사용해 유저 정보를 관리하는 것은 Google에 매우 의존적이므로 기업이 사용하기엔 좋지 못한 점이 많으리라 생각되지만 개인이 테스트용, 가볍게 다룰 프로젝트에 적합하다고 생각했기에 이를 통해 구현하였다.
Firebase & Auth - Androidstudio에 관하여선 인터넷에 많은 자료들이 존재하기 때문에 넘어가겠다.
https://firebase.google.com/docs/auth/android/google-signin?hl=ko
https://developer.android.com/training/sign-in/credential-manager?hl=ko
내 코드로 간략하게 보자.
package ...
import ...
class LoginActivity: AppCompatActivity() {
private val binding: ActivityLoginBinding by lazy { ActivityLoginBinding.inflate(layoutInflater) }
private val auth: FirebaseAuth = FirebaseAuth.getInstance()
private lateinit var googleSignInClient: GoogleSignInClient
private lateinit var activityResultLauncher: ActivityResultLauncher<Intent>
override fun onStart() {
super.onStart()
val currentUser = auth.currentUser
if (currentUser != null) {
Toast.makeText(baseContext, "자동 로그인 성공", Toast.LENGTH_SHORT,).show()
startActivity(Intent(this, MainActivity::class.java))
finish()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
initView()
}
private fun initView() {
buttonListener()
activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == Activity.RESULT_OK) {
val task = GoogleSignIn.getSignedInAccountFromIntent(it.data)
try {
val account = task.getResult(ApiException::class.java)!!
firebaseAuthWithGoogle(account.idToken!!)
} catch (e: ApiException) {
// Google Sign In failed, update UI appropriately
}
}
}
}
private fun buttonListener() {
with(binding) {
registerBtn.setOnClickListener {
startActivity(Intent(this@LoginActivity, RegisterActivity::class.java))
}
googleLoginBtn.setOnClickListener {
CoroutineScope(Dispatchers.IO).launch {
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(BuildConfig.OAuthID)
.requestEmail()
.build()
googleSignInClient = GoogleSignIn.getClient(this@LoginActivity, gso)
activityResultLauncher.launch(googleSignInClient.signInIntent)
}
}
loginBtn.setOnClickListener {
val email = editTextPersonName1.text.toString()
val password = editTextPersonName2.text.toString()
if (email.isNotEmpty() && password.isNotEmpty()) {
auth.signInWithEmailAndPassword(email, password).addOnCompleteListener { task ->
if (task.isSuccessful) {
Toast.makeText(baseContext, "로그인 성공", Toast.LENGTH_SHORT).show()
startActivity(Intent(this@LoginActivity, MainActivity::class.java))
finish()
} else {
Toast.makeText(baseContext, "인증 실패", Toast.LENGTH_SHORT,).show()
}
}
} else {
Toast.makeText(this@LoginActivity, "이메일과 비밀번호를 다시 확인해주세요.", Toast.LENGTH_SHORT).show()
}
}
}
}
private fun firebaseAuthWithGoogle(idToken: String) {
if (idToken != "") {
val credential: AuthCredential = GoogleAuthProvider.getCredential(idToken, null)
auth.signInWithCredential(credential).addOnCompleteListener {
if (auth.currentUser != null) {
val user: FirebaseUser = auth.currentUser!!
Toast.makeText(baseContext, "로그인 성공", Toast.LENGTH_SHORT).show()
startActivity(Intent(this@LoginActivity, MainActivity::class.java))
finish()
}
}
}
}
}
구글로그인, 이메일로그인과 관련된 부분만 표현하였다.
이는 Firebase Auth 세팅시 로그인 제공업체를 선택할 수 있는데 여러 방법이 존재했고, 이 중 이메일과 Google만 선택하였기 때문이다.
구글 로그인의 경우,
위 코드를 토대로 구글 로그인 버튼을 클릭하게 되면, gso, googleSignInClient를 통해 구글이 제공하는 계정 선택 UI가 뜨게 되고 선택하게 되면 activityResultLauncher로 resultCode OK를 통해 들어오게 된다.
이렇게 받은 계정정보를 Firebase Auth 함수와 처리하여 로그인 시킨다.
계정이 없더라도 선택한 구글 계정 정보로 자동 회원가입이 된다.
이메일 로그인의 경우,
Firebase Auth로 입력한 이메일과 비밀번호를 보내어 매칭된다면 로그인되어 Main UI로 넘어가게되고, 틀리다면 로그인 실패로 넘어가게 된다. 그렇게 회원가입 버튼을 통해 회원가입 창으로 넘어가 이메일과 비밀번호로 회원가입을 진행하게 된다.
회원가입 코드는 다음과 같다.
registerBtn.setOnClickListener {
val email = binding.editTextPersonName1.text.toString()
val password = binding.editTextPersonName2.text.toString()
if (email.isNotEmpty() && password.isNotEmpty()) {
auth.createUserWithEmailAndPassword(email, password).addOnCompleteListener { task ->
if (task.isSuccessful) {
Toast.makeText(baseContext, "계정이 생성되었습니다.", Toast.LENGTH_SHORT,).show()
} else {
Toast.makeText(baseContext, "Authentication failed.", Toast.LENGTH_SHORT,).show()
}
}
} else {
Toast.makeText(this@RegisterActivity, "이메일과 비밀번호를 다시 확인해주세요.", Toast.LENGTH_SHORT).show()
}
}
이 코드는 RegisterActivity에 있는 코드로, 회원가입 UI의 EditText(email, password)를 채워넣고 회원가입 버튼을 누르면 Firebase Auth의 이메일-비밀번호로 유저생성하는 함수를 통해 계정이 생성되게 된다.
이때 부합하지 않는 형식, 포맷(이메일 형식, 비밀번호 길이 등...)이라면 에러 로그를 내뱉는데, 이러한 처리도 따로 해주어야할 것이다. 이는 이메일 로그인에서도 마찬가지이다.
'개발 > AOS' 카테고리의 다른 글
Jetpack Compose 커스텀 그림자 (0) | 2024.05.02 |
---|---|
Jetpack Compose에서의 State (0) | 2024.04.30 |
UI 공부 (0) | 2024.01.16 |
날씨 앱 기록 03 (1) | 2023.10.20 |
날씨 앱 기록 02 (2) | 2023.10.13 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!