ChamomileGuides 3.0.4 Help

구글 로그인(AOS)

개요

Google 로그인은 사용자가 Google 계정을 사용하여 외부 애플리케이션 또는 웹사이트에 쉽게 로그인할 수 있도록 하는 인증 시스템입니다. 이를 통해 사용자는 별도의 계정을 만들 필요 없이 Google 계정을 통해 안전하게 로그인하고, 애플리케이션은 사용자의 이메일, 이름 등과 같은 기본 정보를 가져올 수 있습니다.

구현 방법

(1) 구글 클라우드 콘솔 세팅
(2) 프로젝트 설정
(3) 서비스 구현
(4) 로그인 테스트
(5) Q&A

구글 클라우드 콘솔 세팅

  1. 구글 클라우드 콘솔 로그인
    https://console.cloud.google.com/apis/dashboard?project=chamomileapp-ab15d

  2. 프로젝트 생성 (Firebase에서 사용한 기존 프로젝트가 있다면 그대로 사용)

    file
    file

  3. OAuth 동의 화면 설정

    file
    file
    file
    file
    file

  4. OAuth 클라이언트 ID 생성

    file

    • 애플리케이션 유형은 웹 애플리케이션을 선택하고 이름을 입력하고 만들기

      file

    • 클라이언트ID는 나중에 프로젝트 설정을 할때 필요하므로 기억해둔다.

      file

  5. Firebase에서 Authentication 사용 설정
    파이어베이스에 접속하여 프로젝트 선택 (구글 클라우드 콘솔과 연동)

    file
    file
    file
    file

    • 위의 과정까지 마치면, 아래와 같은 화면이 나온다.

      file

프로젝트 설정

  1. build.gradle (Module)
    repositories에 google() 저장소 추가

    file

  2. 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'
    file

서비스 구현

  1. 구글 로그인 클라이언트를 초기화 (아래 전체 코드에 포함)

    • requestIdToken - 토큰을 요청, 파라미터로 구글 클라우드 콘솔에 있는 클라이언트ID를 설정

    • requestEmail - 이메일을 요청

    • GoogleSignIn.getClient(it, gso) - 지정된 옵션을 사용하여 구글 로그인 클라이언트를 생성

    • 아래 표시된 부분에 클라이언트ID를 넣어준다.

      file

  2. 구글로그인 모듈 구현 (전체 코드)

    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) } }

로그인 테스트

file
file
file

Q&A

  1. com.google.android.gms.common.api.ApiException: 10 에러

    FingerPrint가 일치하지 않을 때 발생한다. (인증이 일치하지 않을 때)
    작업하는 PC가 달라졌을 때, FingerPrint가 달라진다. 즉, PC가 바뀌면 구글 API에서 인증을 추가적으로 받아야 한다.

    • 나의 디버그 인증서 (SHA-1)가 등록 안 되어있으면 추가해준다. (협업을 하는 경우 다른 팀원이 등록하여 다른 SHA-1키가 등록되어 있을 수 있음.)

      file

  2. java.lang.Error: com.google.android.gms.common.api.ApiException: 12500: 에러

    메일이 등록되어있지 않아, 문제가 발생한다.

    • 파이어베이스 설정에서 '지원 메일' 등록

      file

    • 구글 클라우드 콘솔에서 '개발자 연락처 정보' 등록

      file
      file

Last modified: 21 4월 2025