안드로이드 App에서 Google 로그인 연동
너무 간간히 연동 하다보니 할때마다 항상 새롭다.
당연히 삽질도 새롭게 다시 시작하고...
또 잊어버리기 전에 기록 해두어야겠다.
1. 프로젝트 등록 (구글 개발자 콘솔)
https://console.developers.google.com 에서 새 프로젝트를 등록한다.
firebase에서 새앱을 생성할때 프로젝트가 필요한다.
(잘 모르겠는 경우 "구글 개발자 콘솔 프로젝트 등록" 으로 검색해 보자)
2. 새앱 생성 (firebase 개발자 콘솔)
https://console.firebase.google.com 에서 프로젝트를 추가한다.
생성된 프로젝트에서 "설정 -> 내앱 -> 앱추가" 순서로 진입한다.
(잘 모르겠는 경우 "firebase 개발자 콘솔 앱추가" 로 검색해 보자)
패키지명과 닉네임을 작성한다.
디버그 서명 인증서 SHA-1은 안드로이드 스튜디어에서 확인한다.
좌측의 Gradle 탭을 선택하면 나오는 트리 중 Task > signiningReport 를 선택한다.
아래쪽 콘솔창 출력 텍스트 중 SHA1에 나오는 키를 디버그 서명난에 등록한다.
이렇게 앱을 등록하면 다음 과정에서 구성 파일을 다운로드 한다. (google-services.json)
다운로드 받은 파일을 PROJECT_ROOT/app 디렉토리 아래로 이동한다.
3. 라이브러리 설정 (gradle 파일)
- Project > build.gradle 파일에 추가한다.
dependencies {
............
classpath 'com.google.gms:google-services:4.0.0'
}
- Project > App > build.gradle 파일에 추가한다.
dependencies {
............
compile 'com.google.firebase:firebase-core:16.0.0'
compile 'com.google.firebase:firebase-auth:16.0.1'
compile 'com.google.android.gms:play-services-auth:15.0.1'
}
apply plugin: 'com.google.gms.google-services'
라이브러리 버전에 신경쓰자, 버전을 못맞춰서 한참 고생했다.
(버전이 안맞으면 버전이 안맞는다든지 이런 에러가 나오는게 아니라 "Not found class" 라든지, 뭐뭐가 Null 이라든지 이런 에러 메세지가 나오기 때문에 발견하기 어렵다.)
4. 구글 로그인 연동
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="PACKAGE_NAME.MainActivity">
<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/mStatusTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/sign_in_button"
android:layout_marginTop="99dp"
android:text="TextView" />
</RelativeLayout>
중요한건 com.google.android.gms.common.SignInButton 이다.
public class MainActivity extends FragmentActivity implements View.OnClickListener, GoogleApiClient.OnConnectionFailedListener {
private GoogleApiClient mGoogleApiClient;
private int RC_SIGN_IN = 1000;
private final String TAG = "TAG";
private TextView mStatusTextView;
실행 Activity 는 FragmentActivity 여야 한다.
클릭 이벤트 처리와 구글 연동 에러를 처리하기 위한 이벤트는 implements 에 넣었다, 물론 여기에 넣지 않고 메소드에서 구현 해도 상관없다.
private void setGoogleLogin() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button);
signInButton.setSize(SignInButton.SIZE_STANDARD);
signInButton.setScopes(gso.getScopeArray());
findViewById(R.id.sign_in_button).setOnClickListener(this);
mStatusTextView = (TextView) findViewById(R.id.mStatusTextView);
}
OnCreate 함수에서 호출하는 객체 초기화 메소드 이다.
GoogleSignInOptions 에서 GoogleApiClient를 위한 Option을 지정한다.
requestIdToken(getString(R.string.default_web_client_id)) 에서 지정한 R.string.default_web_client_id 는 firebase console 에서
다운로드 받은 google-services.json 내에 있다.
mGoogleApiClient 가 핵심이다. 이게 모든 액션을 처리한다.
이하 SingInButton은 클릭 이벤트를 걸었고, Override 되는 onClick 함수에서 Click 이벤트를 처리해 주자.
public void onClick(View view) {
signIn();
}
private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
로그인 버튼을 클릭하면 구글에서 제공하는 로그인 화면이 뜬다.
이 화면에서 로그인을 처리하면 onActivityResult 함수를 호출해 준다.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);
}
}
private void handleSignInResult(GoogleSignInResult result) {
if(result.isSuccess()) {
GoogleSignInAccount acct = result.getSignInAccount();
Log.i(TAG, "email:" + acct.getEmail());
Log.i(TAG, "id:" + acct.getId());
Log.i(TAG, "profile:" + acct.getPhotoUrl());
Log.i(TAG, "DispName > " + acct.getDisplayName());
}
}
OnActivityResult 함수에서 로그인 처리 결과값을 받아 결과거 성공이면 GoogleSignInResult 객체로 받아 GoogleSignInAccount 객체로 변환한다.
변환된 객체에서 필요한 정보를 가져온다.