새로운 구글 로그인 API, Google Identity Service 구현하기

Jonghwan Choi·2023년 1월 20일
0

Open API

목록 보기
2/3

공식 소개 영상
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}")
            }
    }
}
profile
유니티 게임 클라이언트 개발자를 꿈꾸는 뉴비

0개의 댓글