본문 바로가기

Android/개념 및 예제

[Android] 구글 로그인을 안드로이드 앱에 연동하기

이번에는 구글 로그인을 연동해보겠습니다.

 

구글 로그인도 카카오 로그인처럼 실 서비스에 적용하기 위해서는 다음 3단계를 거쳐야 합니다.

1. 앱 등록 및 설정

2. 기능 구현

3. 릴리즈 키 등록

 

저는 실 서비스가 아닌 구글 로그인 테스트를 위한 것이기 때문에 1, 2 단계를 통해 구글 로그인을 연동해보겠습니다.

3단계에 대한 내용은 추후에 다루겠습니다.

 

구글 로그인 연동하는 방법은 구글 공식 문서에 자세히 나와있기 때문에 따라서 하시면 됩니다.

developers.google.com/identity/sign-in/android/start-integrating

 

Start Integrating Google Sign-In into Your Android App

Before you can start integrating Google Sign-In in your own app, you must configure a Google API Console project and set up your Android Studio project. The steps on this page do just that. The next steps then describe how to integrate Google Sign-In into

developers.google.com

 

1. 앱 등록 및 설정

Google API Console에 프로젝트를 만들고 SHA 인증서 지문을 등록하면 됩니다.

 

SHA 인증서 지문을 받는 방법은 다음 문서에 따르면 2가지 방법이 있습니다.

developers.google.com/android/guides/client-auth

 

Authenticating Your Client  |  Android용 Google API  |  Google Developers

Certain Google Play services (such as Google Sign-in and App Invites) require you to provide the SHA-1 of your signing certificate so we can create an OAuth2 client and API key for your app. To get your SHA-1, follow the instructions to use Keytool or Grad

developers.google.com

1. Keytool 사용

2. Gradle의 서명 보고서 사용

저희는 Gradle을 이용해 인증서 지문을 가져오겠습니다.

Gradle > {앱 이름} > Tasks > android > signingReport 실행을 통해 인증서 지문을 가져올 수 있습니다.

저희가 필요한 것은 SHA1 지문입니다.

 

Google Console API에 프로젝트를 등록하면서 SHA1 지문을 등록하면 됩니다.

인증서 지문을 등록하면 구글 로그인을 위한 OAuth client가 구성됩니다.

 

Google Cosole에 가면 다음과 같이 client ID가 등록이 된 것을 확인할 수 있습니다.

 

2. 기능 구현

2-1 Google Sign In API와 호출할 구글 로그인 클라이언트 설정 및 생성

// 앱에 필요한 사용자 데이터를 요청하도록 로그인 옵션을 설정한다.
// DEFAULT_SIGN_IN parameter는 유저의 ID와 기본적인 프로필 정보를 요청하는데 사용된다.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail() // email addresses도 요청함
                .build();

// 위에서 만든 GoogleSignInOptions을 사용해 GoogleSignInClient 객체를 만듬
mGoogleSignInClient = GoogleSignIn.getClient(MainActivity.this, gso);

 

2-2 로그인 버튼 생성

<com.google.android.gms.common.SignInButton
        android:id="@+id/sign_in_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

 

2-3 로그인 요청

@Override
public void onClick(View v) {
        switch (v.getId()) {
            case R.id.sign_in_button:
                signIn();
                break;
        }
}

private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }
}

 

2-4 사용자 정보 가져오기

private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount acct = completedTask.getResult(ApiException.class);

            if (acct != null) {
                String personName = acct.getDisplayName();
                String personGivenName = acct.getGivenName();
                String personFamilyName = acct.getFamilyName();
                String personEmail = acct.getEmail();
                String personId = acct.getId();
                Uri personPhoto = acct.getPhotoUrl();

                Log.d(TAG, "handleSignInResult:personName "+personName);
                Log.d(TAG, "handleSignInResult:personGivenName "+personGivenName);
                Log.d(TAG, "handleSignInResult:personEmail "+personEmail);
                Log.d(TAG, "handleSignInResult:personId "+personId);
                Log.d(TAG, "handleSignInResult:personFamilyName "+personFamilyName);
                Log.d(TAG, "handleSignInResult:personPhoto "+personPhoto);
            }
        } catch (ApiException e) {
            // The ApiException status code indicates the detailed failure reason.
            // Please refer to the GoogleSignInStatusCodes class reference for more information.
            Log.e(TAG, "signInResult:failed code=" + e.getStatusCode());

        }
}

 

 

로그인 성공

다음과 같이 코드를 작성하고 로그인을 시도하면 다음과 같이 기기에 로그인된 구글 계정을 가져옵니다.

 

다음은 로그인에 성공해서 사용자 정보를 성공적으로 가져온 것을 보여줍니다.

 

 

** 자동로그인을 위한 사용자의 이전 로그인 여부 확인

매번 이렇게 로그인하는 것은 사용자 경험에 좋지 않습니다.

이전에 로그인한 적이 있는지 여부는 다음 코드를 통해서 알 수 있습니다.

// 앱에 필요한 사용자 데이터를 요청하도록 로그인 옵션을 설정한다.
// DEFAULT_SIGN_IN parameter는 유저의 ID와 기본적인 프로필 정보를 요청하는데 사용된다.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestEmail() // email addresses도 요청함
        .build();

// 위에서 만든 GoogleSignInOptions을 사용해 GoogleSignInClient 객체를 만듬
mGoogleSignInClient = GoogleSignIn.getClient(MainActivity.this, gso);

// 기존에 로그인 했던 계정을 확인한다.
GoogleSignInAccount gsa = GoogleSignIn.getLastSignedInAccount(MainActivity.this);

// 로그인 되있는 경우
if (gsa != null) {
	// 로그인 성공입니다.
    ''''''
}

 

 

** 로그아웃

- 단순히 로그아웃만 하려는 경우

이 코드는 앱에 연결된 계정을 지웁니다. 다시 로그인하려면 사용자가 자신의 계정을 다시 선택해야 합니다.

private void signOut() {
    mGoogleSignInClient.signOut()
            .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    // ...
                }
            });
}

 

 

- 사용자가 회원 삭제를 요청한 경우

사용자가 계정을 삭제하는 경우 앱이 Google API에서 얻은 정보를 삭제해야 합니다.

private void revokeAccess() {
    mGoogleSignInClient.revokeAccess()
            .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    // ...
                }
            });
}

 

전체 코드는 깃허브에서 확인할 수 있습니다.

github.com/keepseung/Android-Blog-Source/tree/master/googlelogin

 

keepseung/Android-Blog-Source

https://develop-writing.tistory.com/ 에서 제공하는 예제. Contribute to keepseung/Android-Blog-Source development by creating an account on GitHub.

github.com