728x90
반응형

#본글은 Firebase에 프로젝트 등록까지 진행 후 내용입니다.

 

Google 로그인 기능을 추가하여 회원가입 없이 로그인 하는 용도로 사용됩니다.

 

Firebase에서 지원하고 있으며 기능을 구현해보도록 하겠습니다.

 

 

 

 

우선 Firebase 에 접속합니다.

 

https://console.firebase.google.com

 

로그인 - Google 계정

하나의 계정으로 모든 Google 서비스를 Google 계정으로 로그인

accounts.google.com

 

Authenfication 으로 들어간 뒤 '로그인 방법' 탭을 클릭합니다.

 

여러가지 로그인 기능이 있는데 Google 로그인을 사용 설정 합니다.

 

 

 

 

 

 

 

 

사용자 탭으로 가보면 아직 사용자 정보가 보여지지 않고 있습니다.

 

정상적으로 로그인을 하면 이 화면에서 사용자가 보여집니다.

 

 

 

 

 

 

Android Studio 로 돌아가 앱 수준 build.gradle 파일에 

 

Firebase 인증 및 Google 로그인에 대한 종속 항목을 추가합니다.

 

implementation 'com.google.firebase:firebase-auth:16.0.3'
implementation 'com.google.android.gms:play-services-auth:16.0.0'
cs

 

 

 

 

 

activity_main.xml 에 아래와 같이 추가해 주었습니다.

 

    <com.google.android.gms.common.SignInButton
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp" android:id="@+id/googleLoginBtn"/>
 
cs

 

 

 

 

ConstraintLayout 으로 구성하였고 Design 에 이렇게 보여지게 됩니다.

 

 

 

 

 

 

RC_SIGN_IN 은 Activity 의 requestCode 를 정해주었고

 

googleSigninClient 객체, firebaseAuth 객체 변수를 전역으로 선언해 주었습니다.

 

    // Google Login result
    private val RC_SIGN_IN = 9001
 
    // Google Api Client
    private var googleSigninClient: GoogleSignInClient? = null
 
    // Firebase Auth
    private var firebaseAuth: FirebaseAuth? = null
cs

 

 

 

 

 

Android 앱에 Google 로그인 통합하기 페이지를 참고해 Google 로그인을 앱에 통합

 

아래와 같이 GoogleSignInOptions 객체를 구성할 때 requestIdToken을 호출합니다.

 

구글 버튼이 클릭이 되면 구글 계정 인증 Activity가 보여지게 됩니다.

 

    // [START onCreate]
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        // [START config_signin]
        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build()
        // [END config_signin]
 
        googleSigninClient = GoogleSignIn.getClient(this, gso)
 
        firebaseAuth = FirebaseAuth.getInstance();
 
        googleLoginBtn.setOnClickListener {
            val signInIntent = googleSigninClient?.getSignInIntent()
            startActivityForResult(signInIntent, RC_SIGN_IN)
        }
    }
    // [END onCreate]
cs

 

 

 

 

 

 

정상적으로 로그인이 되었다는 것이고 Firebase에 등록을 수행합니다.

 

이렇게 응답이 정상이면 firebaseAuthWithGoogle 함수를 호출 합니다.

 

    // [START onActivityResult]
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
 
        // Google 로그인 인텐트 응답
        if (requestCode === RC_SIGN_IN) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                // Google Sign In was successful, authenticate with Firebase
                val account = task.getResult(ApiException::class.java)
                firebaseAuthWithGoogle(account)
            } catch (e: ApiException) {
 
            }
        }
    }
    // [END onActivityResult]
cs

 

 

 

 

 

 

사용자가 정상적으로 로그인한 후에 GoogleSignInAccount 객체에서 ID 토큰을 가져와

 

Firebase 사용자 인증 정보로 교환하고 Firebase 사용자 인증 정보를 사용해 Firebase에 인증합니다.

 

signInWithCredential 에 대한 호출이 성공하면 getCurrentUser 메소드로 사용자의 계정 데이터를 가져올 수 있습니다.

 

    // [START firebaseAuthWithGoogle]
    private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
 
        val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
        firebaseAuth!!.signInWithCredential(credential)
            .addOnCompleteListener(this) {
 
                // 성공여부
                if (it.isSuccessful) {
 
                    val user = firebaseAuth?.currentUser
                    Toast.makeText(this"로그인 성공", Toast.LENGTH_SHORT).show()
 
                } else {
 
                    Toast.makeText(this"로그인 실패", Toast.LENGTH_SHORT).show()
                }
            }
    }
    // [END firebaseAuthWithGoogle]
cs
 

 

 

 

 

 

정상적으로 로그인이 되었다면 Firebase 사용자 탭으로 이동해 보겠습니다.

 

아래와 같이 사용자 정보가 추가되어있다면 잘 적용된 것입니다.

 

 

 

 

사용자를 로그아웃시키려면 signOut을 호출하면 됩니다.

    FirebaseAuth.getInstance().signOut();
cs

 

728x90
반응형

+ Recent posts