해당 포스팅은 구글 로그인 연동에 관한 포스팅입니다.
안녕하세요 구글 로그인에 관하여 다시 구현하면서 변경된 점과 추가 할 사항이 있어 몇가지 더 적도록 하겠습니다. (2017.12.5)
1. API 콘솔 설정
구글 로그인을 사용하기 위한 사전 작업으로 링크를 통해 API 콘솔에 접속해 구글 로그인을 사용할 프로젝트를 생성합니다. |
생성후 '사용자 인증정보' 탭으로 이동후 '사용자 인증 정보 만들기' 를 선택합니다. 'OAuth 클라이언트 ID' 를 선택합니다. |
그리고 OAuth 동의 화면에 필요한 값들을 입력 후 아래와 같은 화면 빈칸을 채워주세요. 아래 정보중 서명 인증서 지문은 제 블로그 글을 참고해주세요. (SHA-1 지문을 얻는법) |
2. Firebase Console 설정
제일 먼저 Firebase Console에서 프로젝트 생성 및 설정을 해야합니다. 링크를 통해 Firebase Console에서 프로젝트 추가를 누르고 프로젝트 목록에 1번 과정에서 생성한 프로젝트를 선택하시면 됩니다. |
프로젝트 설정에서 안드로이드 앱 추가를 선택하시고 다음과 같은 화면의 값들을 입력해주세요. 패키지이름 : 안드로이드 프로젝트 패키지 이름 앱 닉네임 : 선택사항으로 본인이 식별 가능한 이름으로 작명 디버그 서명 인증서 SHA-1 : 선택사항 이지만 구글 로그인 사용시 필수 , 1번 과정에서 얻은값을 입력 |
다음 화면에서 'google-services.json' 파일을 다운받고 추가 절차를 따라주세요.
3. 프로젝트 설정
프로젝트에 Firebase를 사용하기 위한 작업이 필요합니다.
app단 gradle에 firebase 인증에 대한 종속 항목을 추가해야합니다. |
compile 'com.google.firebase:firebase-auth:10.0.1'
compile 'com.google.android.gms:play-services-auth:10.0.1'
프로젝트단 gradle에 추가 |
dependencies {
....
classpath 'com.google.gms:google-services:3.1.0'//구글로그인
}
앱단 gradle 파일 제일 하단에 다음과 같이 추가해주세요.
|
dependencies {
....
}
apply plugin: 'com.google.gms.google-services'
4. 사용하기
실질적으로 구글 로그인을 사용하려는 엑티비티에 소스를 추가하겠습니다. 구글 로그인에 대한 사전 세팅입니다. FirebaseAuth.getInstance().signOut(); 구글 로그인을 사용하다보면 로그인을 시도할때마다 목록을 불러오도록 해야 할 경우가 있습니다. 다음 코드를 통해 기존에 로그인 되어 있는 캐시(?) 정보가 있다면 로그아웃을 통해 사라지고 아이디들을 선택할 수 있습니다. 상단 코드중 web client id 에 해당하는 값은 api콘솔에 OAuth 2.0 클라이언트 ID 에 있는 Web Client ID 값을 넣어 주시면 됩니다. |
private void setGoogleLogin() {
FirebaseAuth.getInstance().signOut();
GoogleSignInOptions gso = new GoogleSignInOptions.Builder
(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("web client id")
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */,
new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
} /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}
구글 로그인이 필요한 시점에 아래와 같은 메소드를 실행 시켜주시면 됩니다. |
private void loginGoogle() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, SIGN_IN);
}
로그인이 성공하면 아래와 같은 값들을 상황에 맞게 처리합니다. |
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result != null) {
if (result.isSuccess()) {
// 로그인 성공 했을때
GoogleSignInAccount acct = result.getSignInAccount();
String personName = acct.getDisplayName();
String personEmail = acct.getEmail();
String personId = acct.getId();
String tokenKey = acct.getServerAuthCode();
mGoogleApiClient.disconnect();
Log.e("GoogleLogin", "personName=" + personName);
Log.e("GoogleLogin", "personEmail=" + personEmail);
Log.e("GoogleLogin", "personId=" + personId);
Log.e("GoogleLogin", "tokenKey=" + tokenKey);
} else {
Log.e("GoogleLogin", "login fail cause=" + result.getStatus().getStatusMessage());
// 로그인 실패 했을때
}
}
} else {
}
}
사용자가 정상적으로 로그인한 후에 Firebase 사용자 인증 정보로 교환합니다. |
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithCredential", task.getException());
Toast.makeText(MainActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
// ...
}
});
}
구글 로그인은 위 처럼 커스텀 버튼이 아닌 공식적으로 제공해주는 버튼 또 한 존재합니다.
하지만 다른 SNS와는 조금 다르게 클릭 이벤트를 따로 지정해줘야 합니다.
먼저 lauout.xml에 로그인 버튼을 생성하고 엑티비티에 선언과 할당을 위한 코드를 작성합니다
|
<com.google.android.gms.common.SignInButton
android:id="@+id/google_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button);
signInButton.setSize(SignInButton.SIZE_STANDARD);
signInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
});
※해당 포스팅은 지극히 객관적인 내용으로 저자의 복기 목적으로 작성된 것이고, 내용에대해 수정이나 추가 요청은 언제든 환영합니다.
'안드로이드 > 자바' 카테고리의 다른 글
[안드로이드/Android] 안드로이드 스튜디오 2.3에서 앱 릴리즈시 이슈사항 (0) | 2017.05.15 |
---|---|
[안드로이드/Android] 안드로이드 스튜디오 설치 (0) | 2017.04.20 |
[안드로이드/Android] 카메라와 갤러리에서 사진 가져오기 (70) | 2017.04.13 |
[안드로이드/Android] EditText사용시 키보드가 UI를 가릴때 (9) | 2017.04.13 |
[안드로이드/Android] Dialog 와 AlertDialog 사용하기 (0) | 2017.04.12 |