구글 로그인(AOS)
개요
Google 로그인은 사용자가 Google 계정을 사용하여 외부 애플리케이션 또는 웹사이트에 쉽게 로그인할 수 있도록 하는 인증 시스템입니다. 이를 통해 사용자는 별도의 계정을 만들 필요 없이 Google 계정을 통해 안전하게 로그인하고, 애플리케이션은 사용자의 이메일, 이름 등과 같은 기본 정보를 가져올 수 있습니다.
구현 방법
(1) 구글 클라우드 콘솔 세팅
(2) 프로젝트 설정
(3) 서비스 구현
(4) 로그인 테스트
(5) Q&A
구글 클라우드 콘솔 세팅
구글 클라우드 콘솔 로그인
https://console.cloud.google.com/apis/dashboard?project=chamomileapp-ab15d프로젝트 생성 (Firebase에서 사용한 기존 프로젝트가 있다면 그대로 사용)
OAuth 동의 화면 설정
OAuth 클라이언트 ID 생성
애플리케이션 유형은 웹 애플리케이션을 선택하고 이름을 입력하고 만들기
클라이언트ID는 나중에 프로젝트 설정을 할때 필요하므로 기억해둔다.
Firebase에서 Authentication 사용 설정
파이어베이스에 접속하여 프로젝트 선택 (구글 클라우드 콘솔과 연동)위의 과정까지 마치면, 아래와 같은 화면이 나온다.
프로젝트 설정
build.gradle (Module)
repositories에 google() 저장소 추가build.gradle (Project)
Google Play 서비스 dependency를 추가// Google Play Services implementation 'com.google.android.gms:play-services-auth:19.0.0' implementation 'com.google.android.gms:play-services-auth-api-phone:17.5.0' implementation 'com.google.android.gms:play-services-maps:17.0.0' implementation 'com.google.android.gms:play-services-location:17.1.0'
서비스 구현
구글 로그인 클라이언트를 초기화 (아래 전체 코드에 포함)
requestIdToken - 토큰을 요청, 파라미터로 구글 클라우드 콘솔에 있는 클라이언트ID를 설정
requestEmail - 이메일을 요청
GoogleSignIn.getClient(it, gso) - 지정된 옵션을 사용하여 구글 로그인 클라이언트를 생성
아래 표시된 부분에 클라이언트ID를 넣어준다.
구글로그인 모듈 구현 (전체 코드)
class SocialLoginController (private val basicAct: AppCompatActivity) { var mInitialized = false var m_action: FlexAction? = null //구글 로그인 ActivityResult용 상수 val RC_SIGN_IN = 9001 private lateinit var mGoogleSignInClient: GoogleSignInClient private fun initialize() { getActivity()?.let { if (!mInitialized) { /** Google Login Module (Firebase) Initialize */ // FirebaseApp.initializeApp(getActivity()) val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getActivity()?.getString(R.string.social_login_info_google_client_id_twk2)) // 토큰을 요청 .requestEmail() // 이메일을 요청 .build() mGoogleSignInClient = GoogleSignIn.getClient(it, gso) // 지정된 옵션을 사용하여 구글 로그인 클라이언트를 생성 mInitialized = true } } } fun startSocialLogin(loginType: DEFINES.SOCIAL_LOGIN.TYPE){ if(!mInitialized) initialize() when(loginType){ DEFINES.SOCIAL_LOGIN.TYPE.google -> { startGoogleLogin() } } } val socialLogin = FlexLambda.action { action, array: FlexArguments -> m_action = action withContext(Dispatchers.Main) { when(array[0]?.asString()){ "google" -> { startSocialLogin(DEFINES.SOCIAL_LOGIN.TYPE.google) } } } } /** 구글 */private fun startGoogleLogin(){ googleLoginResult.launch(mGoogleSignInClient.signInIntent) // getActivity()?.startActivityForResult(signInIntent, RC_SIGN_IN) } /** onActivityResult */ private val googleLoginResult = basicAct.registerForActivityResult( StartActivityForResult()) { result: ActivityResult -> val resultCode = result.resultCode val data = result.data try { val completedTask: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(data) val account = completedTask.getResult(ApiException::class.java) onLoginCompleted(DEFINES.SOCIAL_LOGIN.TYPE.google, "${account?.id}", "${account?.idToken}",null) } catch (e: ApiException) { onError(DEFINES.SOCIAL_LOGIN.TYPE.google, Error(e)) } } private fun onLoginCompleted(loginType: DEFINES.SOCIAL_LOGIN.TYPE, userId: String?, accessToken: String?, error: Error?){ Toast.makeText(App.context,"로그인 완료 userId : $userId , accessToken : $accessToken", Toast.LENGTH_SHORT).show() val returnData = JSONObject() returnData.put("userId", userId) returnData.put("accessToken", accessToken) val returnObj = Utils.returnJson(authValue = true, dataValue = returnData, msgValue = null) m_action?.promiseReturn(returnObj) } private fun onError(loginType : DEFINES.SOCIAL_LOGIN.TYPE, error : Error?){ Toast.makeText(App.context,"로그인 중 에러발생 ${error.toString()}", Toast.LENGTH_SHORT).show() val returnObj = Utils.returnJson(authValue = false, dataValue = null, msgValue = "로그인 중 에러발생 ${error.toString()}") m_action?.promiseReturn(returnObj) } }
로그인 테스트
Q&A
- com.google.android.gms.common.api.ApiException: 10 에러
FingerPrint가 일치하지 않을 때 발생한다. (인증이 일치하지 않을 때)
작업하는 PC가 달라졌을 때, FingerPrint가 달라진다. 즉, PC가 바뀌면 구글 API에서 인증을 추가적으로 받아야 한다.나의 디버그 인증서 (SHA-1)가 등록 안 되어있으면 추가해준다. (협업을 하는 경우 다른 팀원이 등록하여 다른 SHA-1키가 등록되어 있을 수 있음.)
- java.lang.Error: com.google.android.gms.common.api.ApiException: 12500: 에러
메일이 등록되어있지 않아, 문제가 발생한다.
파이어베이스 설정에서 '지원 메일' 등록
구글 클라우드 콘솔에서 '개발자 연락처 정보' 등록