Android SNS 로그인 (구글)
참조 : https://developers.google.com/identity/sign-in/android/start
요약 : firebase 및 https://console.cloud.google.com 에서 프로젝트를 각각 추가 해야함.
1. 프로젝트 생성 (firebase 및 구글 콘솔)
- firebase의 경우, https://console.firebase.google.com/u/0/?hl=ko 이동 -> Authentication -> Sign-in method -> 구글 에서 웹 sdk 구성에서 확인 가능
- https://console.cloud.google.com/ 에서 어플리케이션 생성, OAuth 동의 화면 및 이용자 설정등 해주어야 함.
** SHA1 등록 방법
- keytool을 이용한 방법과 안드로이드 스튜디오에서 사용하는 방법이 있음.
- 안드로이드 스튜디오 : 터미널에서, .\gradlew signingReport 입력 후 엔터 -> SHA1 항목을 복사하여, 구글 콘솔에 입력
** 안드로이드 스튜디오는 디버깅용이고, 실제 keystore를 사용할 경우, https://developers.google.com/android/guides/client-auth 방법을 따라서 해야함. 2개의 sha1값을 추가하면 좋음.
2. 프로젝트 세팅 (firebase)
- https://console.firebase.google.com 에서 프로젝트로 이동 -> Authentication -> Sign-in method -> 구글 선택 후 활성화.
- sha1 값 세팅해야함.
3. 프로젝트 세팅 (안드로이드 스튜디오)
- 안드로이드 스튜디오 -> tools -> firebase -> Authentication 에서 gradle 설정 추가
4. 코드
- 구글로그인을 위한 변수 추가
- 버튼클릭시 이벤트 함수에, INTENT를 통한 구글 로그인 진행
- INTENT 종료후 호출되는 콜백함수인 onActivityResult 함수에서 token을 받아온 후 firebase에서 이메일 조회
//메인액티비티 혹은 구글로그인 액티비티 클래스에 맴버변수 추가
private FirebaseAuth mAuth;
private GoogleApi mGoogleApiClient;
private GoogleSignInClient mGoogleSignInClient;
private static final int RC_SIGN_IN = 9001;
//onCreate에 다음 코드 추가. web 클라이언트id 필요
mAuth = FirebaseAuth.getInstance();
GoogleSignInOptions opt = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken("348397439360-5nuf62n0teh63l79t0bq7mgs7gon45b2.apps.googleusercontent.com")
.requestEmail().build();
mGoogleSignInClient = GoogleSignIn.getClient(this, opt);
//구글 로그인 버튼 클릭 함수에 다음코드 추가
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
//로그인 intent 종료 후 콜백 함수인 onActivityResult에 코드 추가
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
// 구글로그인
if(requestCode == RC_SIGN_IN)
{
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = task.getResult(ApiException.class);
Log.d("haha", "firebaseAuthWithGoogle:" + account.getId());
firebaseAuthWithGoogle(account.getIdToken());
} catch (ApiException e) {
// Google Sign In failed, update UI appropriately
Log.w("haha", "Google sign in failed", e);
}
}
else
{
//페이스북 로그인
callbackManager.onActivityResult(requestCode,resultCode,data);
}
super.onActivityResult(requestCode,resultCode,data);
}
//구글로그인 후 firebase에서 유저정보 가져오는 함수
private void firebaseAuthWithGoogle(String idToken) {
AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d("haha", "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
Log.d("haha", "google email : " + user.getEmail());
} else {
// If sign in fails, display a message to the user.
Log.w("haha", "signInWithCredential:failure", task.getException());
}
}
});
}