안드로이드 코틀린 구글 로그인으로 authCode 받아오기
중요데이터
1.sha-1 지문 (구글클라우드 콘솔 안드 유형에 등록할 키)
2.안드 프로젝트 패키지 (구글클라우드 콘솔 안드 유형에 등록할 패키지)
3.클라이언트ID (구글클라우드 콘솔 웹 유형 등록후 받아올 클라이언트 ID)
이번에 소개할 구글 로그인은 파이어베이스를 사용하지 않고 자체 서버에서 회원정보를 관리 하는 환경에서 구글로그인을 사용하는 방식입니다. 자체 서버에서 구글 로그인 정보를 받아와야 하기 때문에 안드에서는 구글서버로 부터 authCode 값을 받아 서버로 넘겨 주어야 하는데요.
이 포스팅에서는 구글 서버로 부터 authCode를 받아오는 과정을 진행해보겠습니다.
코드를 받아온후 부터는 서버 api를 사용하여 서버에 요청을 보내고 응답 받아 로그인 완료 처리를 진행하면 되겠습니다.
의존성dependencies 추가하기
settings.gradle.kts 에 아래와 같은 저장소가 추가 되어 있는지 확인합니다
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
build.gradle 앱수준 파일에 아래와 같이 dependencies를 추가해줍니다.
implementation("com.google.gms:google-services:4.3.15")
implementation("com.google.android.gms:play-services-auth:21.0.0")
Google Cloud Console에서 프로젝트 생성
아래 url에 접속해 구글 클라우드 콘솔에 접속해 줍니다.
https://console.cloud.google.com/welcome?authuser=0&project=reflected-codex-416705
Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.com
사용할 프로젝트가 없다면 프로젝트 새프로젝트를 클릭해 새로 만들어줍니다.
프로젝트를 생성해주고 OAuth 클라이언트 ID를 만들어줍니다.
먼저 안드로이드 OAuth를 만들어주겠습니다.
이름은 원하는 이름을 기입하시면 되고 패키지 이름은 안드로이드 스튜디오의 build.gradle에서 확인후 입력해줍니다.
sha-1 지문은 얻는방법이 여렀있는데 구글링을 해보면 나옵니다. sha-1 지문을 얻고 입력해줍니다.
이번엔 웹 애플리케이션 유형을 추가해줍니다.
이름을 적어주고 서버에서 리디렉션 URI가 있다면 입력해줍니다.
토큰을 받는것은 리디렉션이 URI가 없어도 상관 없습니다.
웹 유형의 클라이언트ID는 GoogleSignInOptions 객체를 만들때 requestServerAuthCode 메서드에 클라이언트ID를 전달할때 사용 하므로 string.xml에 저장하여 사용하도록 합니다.
이렇게 구글 클라우드 콘솔에서의 준비는 모두 끝났습니다. 코드를 추가해보겠습니다.
코드 추가
private val googleSignInClient: GoogleSignInClient by lazy { getGoogleClient() }
private fun getGoogleClient(): GoogleSignInClient {
val googleSignInOption = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestServerAuthCode(getString(R.string.google_login_client_id)) // string 파일에 저장해둔 client id 를 이용해 server authcode를 요청한다.
.requestEmail() // 이메일도 요청할 수 있다.
.build()
return GoogleSignIn.getClient(this, googleSignInOption)
}
googleSignInClient 객체를 생성해 줍니다.
private fun requestGoogleLogin() {
googleSignInClient.signOut()
val signInIntent = googleSignInClient.signInIntent
googleAuthLauncher.launch(signInIntent) // googleAuthLauncher.launch를 호출하면 서버에 요청하여 아래 registerForActivityResult로 응답받는다
}
private val googleAuthLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
try {
val account = task.getResult(ApiException::class.java)
val email = account?.email // email 응답
val serverAuth = account?.serverAuthCode // token 값을 얻을수 있는 데이터
} catch (e: ApiException) {
e.printStackTrace()
}
}