본문 바로가기

안드로이드/팁

[Android] 구글 로그인 연동

반응형

'구글 로그인 연동' 자주 하지 않지만 프로젝트 시작하면 

많이 찾게되는 키워드.. 그래서 헷갈릴때가 많아 다시 한번 정리 합니다! 

 

구글 로그인은 크게 2가지로 구분 됩니다.

파베를 이용한 연동 vs Google Cloud Api를 연동 

 

서버가 없는 경우 파베를 이용하면 회원 관리도 직접할 수 있는 어드민 기능을 제공하고 연동 방식도 조금 더 간단합니다.

 

Google Cloud Api 연동은 서버가 따로 있을 경우 이용하는 방식으로 클라이언트에서 구글 idToken을 발급받아 서버로 전송하면, 서버에선 전달 받은 idToken으로 유저의 정보를 얻고 그걸 토대로 각 서비스의 AccessToken을 발급해줍니다. 

= AccessToken : 서비스 ( 앱 ) 이용시 필요한 유저 인증 정보 

 

해당 포스팅은 Cloud Api 연동 방식을 다룰 예정입니다.

 

OAuth 2.0 Client ID 생성

Google Cloud Console로 이동하여 생성된 프로젝트를 선택합니다. ( 없다면 생성 ) 

'API 및 서비스' > '사용자 인증정보' > '사용자 인증 정보 만들기' 클릭 

아래 정보들을 입력합니다. 

SHA-1 키 발급 방법

아래 사진처럼 안드로이드 스튜디오에서 'signingReport'를 클릭하여 출력된 값을 사용합니다.

'Gradle' 탭 > 'Tasks' > 'android' > 'signingReport'

패키지 이름

개발중인 앱의 패키지 이름을 입력합니다.

 flavor를 사용하여 패키지명이 다른분들은 환경별 알맞는 패키지명을 입력해야합니다.

 

 

Gradle 설정 

자세한 사항은 공식 문서를 참고해주세요 

 

build.gradle ( app level ) 

apply plugin: 'com.android.application'
    ...

    dependencies {
        implementation 'com.google.android.gms:play-services-auth:20.7.0'
    }

 

build.gradle ( project.level )

allprojects {
    repositories {
        google()

        // If you're using a version of Gradle lower than 4.1, you must instead use:
        // maven {
        //     url 'https://maven.google.com'
        // }
    }
}

 

 

LoginUtil.kt

여러 엑티비티에서 사용할 수 있도록 Util파일로 구성 했습니다.

class LoginUtil @Inject constructor(

) {
    private var googleLoginClient: GoogleSignInClient? = null

    private val REQ_GOOGLE_LOGIN = 1001


    fun loginGoogle(activity: Activity){
        val webClientId = activity.getString(R.string.google_login_web_client_id)

        var signInOptions =
            GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(webClientId)
                .requestEmail().build()

        googleLoginClient = GoogleSignIn.getClient(activity, signInOptions)

        googleLoginClient?.let { client ->

            client.signOut().addOnCompleteListener {
                // 로그아웃 후 진행
                activity.startActivityForResult(
                    client.signInIntent,
                    REQ_GOOGLE_LOGIN
                )
            }
        }
    }


    fun handleGoogleActivityResult(
        requestCode: Int,
        resultCode: Int,
        data: Intent?,
        activity: Activity,){

        if(requestCode == REQ_GOOGLE_LOGIN){
            // 유저 로그인
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                val account = task.getResult(ApiException::class.java)
                if (account != null && account.id != null && account.email != null) {

                    L.d("email =${account.email}, id=${account.id}, token =${account.idToken}")
//                    account.email,
//                    account.id,
//                    account.displayName,
//                    account.photoUrl?.path ?: ""

                }

            } catch (e: ApiException) {
                L.d("google login fail = ${e.message}")
                if (e.statusCode == 12501) {
                   // 사용자 취소
                }
            }
        }

    }
}

 

 

궁금하신 사항은 댓글로 남겨주시면 최대한 빨리 답글 달도록 하겠습니다.

 

감사합니다.

 

 

 

 

반응형