본문 바로가기
깡샘 코틀린

20-3 인증 기능 이용하기

by 농농씨 2023. 7. 14.

파이어베이스의 인증(Authentication) 기능은 앱에서 회원가입이나 로그인을 처리할 때 사용한다. 파이어베이스에서는 이메일/비밀번호 인증을 기본으로 제공하며 이 밖에 구글, 페이스북 등 다양한 업체의 인증과 연동하는 방법도 제공한다.

 

 

이메일/비밀번호 인증

먼저 회원가입을 한다는 가정으로 이메일/비밀번호 인증을 처리하는 방법을 살펴보자. 이메일/비밀번호 인증은 사용자의 회원가입 정보인 이메일/비밀번호를 파이어베이스에 1️⃣저장하고 이를 바탕으로 2️⃣로그인을 처리하는 방식이다.

이때 지메일, 핫메일, 네이버 메일, 다음 메일 등 실제로 존재하는 이메일을 등록해야 한다. 등록한 이메일로 인증 메일이 자동 발송되면 사용자는 이메일 계정에 로그인해 해당 메일을 확인함으로써 인증을 처리하는 구조이다. 비밀번호는 이메일 계정이 아닌 파이어베이스 연동 시스템에 로그인할 때 사용하는 비밀번호이다.

이메일/비밀번호 인증을 거쳐 가입이 완료되면 인증 정보가 파이어베이스에 저장되므로 로그인할 때는 등록된 이메일 서버와 연동하지 않고 파이어베이스에서 처리한다.

 

이메일/비밀번호 인증 사용 설정하기

이메일/비밀번호로 인증하려면 파이어베이스 콘솔앱 모듈의 그래들 설정이 필요하다. 먼저 파이어베이스 콘솔에 접속한 후 왼쪽 메뉴에서 [Authentication]을 클릭한다. 그리고 두 번째 탭인 [Sign-in method]에서 이메일/비밀번호 항목이 '사용 설정됨'이어야 한다. 자세한 설정 방법은 20-4절에서!

 

그리고 모듈 수준의 build.gradle 파일에 다음처럼 파이어베이스의 인증 라이브러리를 등록해야 한다.

// 파이어베이스 인증 라이브러리 등록
implementation 'com.google.firebase:firebase-auth-ktx:21.0.1'

 

 

파이어베이스 인증 객체 얻기

안드로이드 앱에서 파이어베이스 인증 처리는 FirebaseAuth 객체를 얻는 것으로 시작한다. FirebaseAuth 객체에서 제공하는 각종 함수로 회원가입, 로그인, 로그아웃, 구글 로그인 등을 처리할 수 있다. 이러한 FirebaseAuth 객체는 Firebase.auth로 얻는다.

// 파이어베이스 인증 객체 얻기
lateinit var auth: FirebaseAuth
(... 생략 ...)
auth = Firebase.auth // FirebaseAuth 객체 얻음

 

 

회원가입하기

먼저 이메일/비밀번호 인증으로 회원가입하는 방법을 살펴보자. FirebaseAuth 객체의 createUserWithEmailAndPassword() 함수로 파이어베이스에 이메일/비밀번호를 등록한다. 매개변수는 등록할 이메일과 비밀번호이며 결과는 addOnCompleteListener() 함수의 두 번째 매개변수로 등록하는 콜백 함수로 확인한다.(두번째 매개변수가 어딨음?)

// 회원 가입하기
auth.createUserWithEmailAndPassword(email, password) // 파이어베이스에 이메일, 비밀번호 등록하는 함수
    .addOnCompleteListener(this) { task -> // 두번째 매개변수에 콜백함수 등록해서 결과 확인
    (... 생략 ...)
}

 

그리고 콜백 함수의 매개변수인 Task<AuthResult> 객체로 회원가입 성공/실패를 판단한다. Task 객체의 isSuccessful로 파이어베이스에 등록이 성공했는지를 알 수 있으며, 실패했다면 exception으로 원인을 확인할 수 있다.

// 회원가입 성공/실패 판단
auth.createUserWithEmailAndPassword(email, password)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) { // 파이어베이스에 등록 성공 여부 판단
        (... 생략 ...)
        } else {
            Log.d("kkang", "createuserWithEmail:failure", task.exception) // exception으로 실패원인 확인
        }
    }

이렇게 하면 사용자가 입력한 이메일/인증번호가 파이어베이스에 등록되지만 이메일/비밀번호 인증은 해당 이메일로 인증 메일을 발송해서 사용자가 인증 절차를 거쳐야만 최종 가입이 완료된다. 따라서 이메일/비밀번호 등록에 성공했을 때 다음처럼 FirebaseUser 클래스의 sendEmailVerification() 함수로 인증 메일을 보내야 한다.

// 인증 메일 발송하기(등록 성공했을 때)
auth.createUserWithEmailAndPassword(dmail, password)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            auth.currentUser?.sendEmailVerification() // 사용자에게 인증 메일 보내는 함수
            // auth.currentUser로 등록한 사용자 정보 가져옴
                ?.addOnCompleteListener { sendTask -> // 인증메일발송 성공여부를 매개변수로 확인
                    if (sendTask.isSuccessful) {
                    // 매개변수에 지정한 함수가 자동으로 호출되면서 성공여부 알려줌
                        // ...
                    } else {
                        // ...
                    }
                }
        } else {
            Log.w("kkang", "createUserWithEmail:failure", task.exception)
        }
    }

먼저 auth.currentUser로 등록한 사용자 정보를 가져오며 이 사용자에게 sendEmailVerification() 함수로 인증 메일을 보낸다. 인증 메일 발송의 성공/실패는 addOnCompleteListener() 함수로 등록한 매개변수로 확인할 수 있다. 매개변수에 지정한 함수가 자동으로 호출되면서 성공/실패 여부를 알려준다.

등록한 메일로 인증 메일이 전달되면 사용자는 이 메일에서 링크를 눌러 인증을 완료한다.

파이어베이스에 이메일/비밀번호 인증이 정상으로 등록되면 파이어베이스 콘솔에서 사용자를 확인할 수 있다.

 

 

로그인하기

이메일/비밀번호 인증으로 가입한 사용자의 로그인을 처리할 때는 signInWithEmailAndPassword() 함수를 이용한다. 이 함수의 매개변수에 대입한 이메일과 비밀번호로 파이어베이스와 연동해 로그인을 처리하며 결과는 addOnCompleteListener()에 등록된 함수를 호출해 알려준다.

// 로그인 처리
auth.signInWithEmailAndPassword(email, password) 
// 매개변수에 이메일과 비밀번호 대입해서 파이어베이스와 연동해 로그인 처리
    .addOnCompleteListener(this) { task -> // 로그인처리 결과 알려줌
        if (task.isSuccessful) {
            // 로그인 성공했을 때 처리
        } else {
            // 로그인 실패했을 때 처리
        }
    }

 

사용자 정보 가져오기

로그인에 성공하면 다음처럼 인증된 사용자 정보를 FirebaseUser 객체로 얻을 수 있다.

// 사용자 정보 가져오기
currentUser?.let {
    val isEmailVerified = currentUser.isEmailVerified
    val email = currentUser.email
    val uid = currentUser.uid
}

 

 

구글 인증

파이어베이스는 앞에서 살펴본 이메이/비밀번호 인증 이외에 구글, 페이스북 등 다양한 업체의 인증 시스템과 연계한 서비스도 제공한다. 이처럼 외부 업체를 이용한 인증 서비스는 로그인할 때마다 해당 업체와 연동함으로써 이루어진다. 여기서는 구글 계정으로 인증하는 방법만 살펴볼 것이다. 즉, 사용자가 자신의 구글 계정으로 회원가입하고 로그인하는 방법이다.

 

구글 인증 사용 설정하기

구글 계정으로 인증하려면 파이어베이스 콘솔과 앱 모듈의 그래들 설정이 필요하다. 먼저 파이어베이스 콘솔에 접속한 후 왼쪽 메뉴에서 [Authentication]을 클릭한다. 그리고 두 번째 탭인 [Sign-in method]에서 Google 항목이 다음처럼 '로그인 제공업체'에 설정돼 있어야 한다. 자세한 설정 방법은 20-4절에서~

그리고 모듈 수준의 build.gradle 파일에 다음처럼 플레이 서비스 인증 라이브러리를 등록해야 한다.

// 플레이 서비스 인증 라이브러리 등록
implementation 'com.google.android.gms:play-services-auth:19.2.0'

 

구글 인증 처리하기

구글 인증은 안드로이드 시스템에 설치된 구글의 인증 앱과 연동하여 처리한다. 앱에서 인텐트에 정보를 설정하여 구글 인증 앱을 실행하면 구글 인증 앱이 인증을 처리하고 결과를 돌려주는 방식이다

// 구글 인증 앱 실행
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestIdToken(getString(R.string.default_web_client_id))
    .requestEmail()
    .build()
val signInIntent = GoogleSignIn.getClient(this, gso).signIntent // 인텐트 객체 생성
requestLauncher.launch(signInIntent) // 인텐트 시작➡️구글 인증 앱 실행

이렇게 하면 구글 인증 앱이 실행되며 이 앱에서 사용자에게 구글 인증 정보를 입력받는다 그리고 사용자가 입력한 정보로 구글 로그인을 시도하고 성공/실패 여부가 앱에 전달된다.

// 구글 인증 처리
val requestLauncher = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
{
    val tast+GoogleSignIn.getSignedInAccountFromIntent(it.data) // 주목
    try {
        val account = task.getResult(ApiException::class.java)!! // 주목
        val credential = GoogleAuthProvider.getCredential(account.idToken, null) // 주목
        MyApplication.auth.signInWithCredential(credential) // 주목
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // 구글 로그인 성공
                } else {
                    // 구글 로그인 실패
                }
            }
    } catch (e: ApiException) {
        // 예외 처리
    }
}
)