공식 소개 영상
GIS 공식 문서
GIS를 이용한 로그인 기능 구현 공식 문서
구글이 Google Sign-in API를 대체할 새로운 Google Identity Service API를 21년 8월 내놓았다. 단순히 Authentication 기능만 있는 게 아니라 Authorization과 인증 정보 관리 기능까지 갖추고 있는 듯하지만, 나는 이 중에서 구글 로그인 기능만 사용할 것이므로 해당 기능의 코드만 구현해 보았다.
로그인 정보를 받아올 때 공식 문서에서는 Activity클래스의 onActivityResult() 메소드를 오버라이딩하는 방법을 사용했으나, 이 방법은 점차 deprecate되는 중이어서 추후 말썽이 생길 수 있다. 그래서 대신 요즘 구글에서 밀고 있는 Activity Result API를 사용했다. 코드는 StackOverflow 답변을 기반으로 약간 개량했다.
로그인 API를 구현하기 전에 구글 콘솔에 프로젝트를 등록하는 과정은 기존 Sign-in API와 동일하다.
링크
// registerForActivityResult()는 AppCompatActivity에서만 사용 가능
class GoogleLoginActivity: AppCompatActivity() {
// 로그인 성공시 수행할 작업을 설계하는 부분
// 위치 제한은 없지만 멤버변수로 두는 게 편함
private val mLoginLauncher =
registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) {
if (it.resultCode == Activity.RESULT_OK){
try {
// 로그인한 계정 정보
val credential =
Identity.getSignInClient(this).getSignInCredentialFromIntent(it.data)
// 계정 정보로 수행할 작업을 여기에 작성할 것
} catch (e: ApiException){
Log.d("TAG", "Google login exception: ${e.statusCode}")
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 로그인 프로세스 시작 (꼭 onCreate()에 넣을 필요는 없음)
startAuth()
}
private fun startAuth(){
// web client id는 구글 콘솔에서 프로젝트 등록 후 확인
val request = GetSignInIntentRequest.builder()
.setServerClientId(getString(R.string.google_web_client_id))
.build()
Identity.getSignInClient(this)
.getSignInIntent(request)
.addOnSuccessListener { result ->
val intentSenderRequest = IntentSenderRequest.Builder(result).build()
mLoginLauncher.launch(intentSenderRequest)
Log.d("TTT", "GoogleLogin launched...")
}.addOnFailureListener { e ->
Log.d("TTT", "preparing intent failed: ${e.message}")
}
}
}