[#13][안드로이드] Firebase로 Google 로그인/로그아웃 구현
Firebase로 Google 로그인/로그아웃 구현
public class LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener{
private FirebaseAuth mAuth;
private static final int RC_SIGN_IN = 9001;
private GoogleApiClient mGoogleApiClient;
@Override
public void onStart() {
super.onStart();
// 활동을 초기화할 때 사용자가 현재 로그인되어 있는지 확인합니다.
FirebaseUser currentUser = mAuth.getCurrentUser();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// GoogleSignInOptions 생성
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();
// 로그인 작업의 onCreate 메소드에서 FirebaseAuth 개체의 공유 인스턴스를 가져옵니다.
mAuth = FirebaseAuth.getInstance();
// 로그인 버튼 이벤트 > signInIntent 호출
Button login_btn_google= (Button) findViewById(R.id.login_google);
login_btn_google.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.v("알림", "구글 LOGIN");
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
});
// 로그아웃 버튼 클릭 이벤트 > dialog 예/아니오
Button logout_btn_google = (Button) findViewById(R.id.logout_google);
logout_btn_google.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
Log.v("알림", "구글 LOGOUT");
AlertDialog.Builder alt_bld = new AlertDialog.Builder(view.getContext());
alt_bld.setMessage("로그아웃 하시겠습니까?").setCancelable(false)
.setPositiveButton("네",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 네 클릭
// 로그아웃 함수 call
signOut();
}
}).setNegativeButton("아니오",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 아니오 클릭. dialog 닫기.
dialog.cancel();
}
});
AlertDialog alert = alt_bld.create();
// 대화창 클릭시 뒷 배경 어두워지는 것 막기
//alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
// 대화창 제목 설정
alert.setTitle("로그아웃");
// 대화창 아이콘 설정
alert.setIcon(R.drawable.check_dialog_64);
// 대화창 배경 색 설정
alert.getWindow().setBackgroundDrawable(new ColorDrawable(Color.argb(255,62,79,92)));
alert.show();
}
});
}
@Override
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);
if (result.isSuccess()) {
// Google Sign In was successful, authenticate with Firebase
Log.v("알림", "google sign 성공, FireBase Auth.");
GoogleSignInAccount account = result.getSignInAccount();
firebaseAuthWithGoogle(account);
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
} else {
// Google Sign In failed, update UI appropriately
Log.v("알림", result.isSuccess() +" Google Sign In failed. Because : " + result.getStatus().toString());
// ...
}
}
}
// 사용자가 정상적으로 로그인한 후에 GoogleSignInAccount 개체에서 ID 토큰을 가져와서
//Firebase 사용자 인증 정보로 교환하고 Firebase 사용자 인증 정보를 사용해 Firebase에 인증합니다.
private void firebaseAuthWithGoogle(GoogleSignInAccount acct){
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.v("알림", "ONCOMPLETE");
// 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.v("알림", "!task.isSuccessful()");
Toast.makeText(LoginActivity.this, "인증에 실패하였습니다.", Toast.LENGTH_SHORT).show();
}else {
Log.v("알림", "task.isSuccessful()");
FirebaseUser user = mAuth.getCurrentUser();
Toast.makeText(LoginActivity.this, "FireBase 아이디 생성이 완료 되었습니다", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.v("알림", "onConnectionFailed");
}
// 로그아웃
public void signOut() {
mGoogleApiClient.connect();
mGoogleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(@Nullable Bundle bundle) {
mAuth.signOut();
if (mGoogleApiClient.isConnected()) {
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(@NonNull Status status) {
if (status.isSuccess()) {
Log.v("알림", "로그아웃 성공");
setResult(1);
} else {
setResult(0);
}
finish();
}
});
}
}
@Override
public void onConnectionSuspended(int i) {
Log.v("알림", "Google API Client Connection Suspended");
setResult(-1);
finish();
}
});
}
}
| cs |
로그아웃 함수 -> finish() -> 로그인 시도 시 로그인 할 구글계정 선택 가능


형님 .... ㅠㅠ ApiException 12500 EROOR 뜨면서 로그인인증이안되네요 ...... 파이어베이스 코드 인터넷이 있는건 전부찾아봣는대 안되네요 ㅜㅜ 도대체 뭘까요 ㅜV/알림: false Google Sign In failed. Because : Status{statusCode=unknown status code: 12500, resolution=null}
답글삭제저도 이문제 때문에 삽질을 좀 했는데 결론은 파이어베이스에서 프로젝트 만들때 새로 만드는게 아니라 구글 API콘솔에서 미리 프로젝트를 만들고 Auth2.0을 만든 후에 파이어 베이스에서 프로젝트만들때 API콘솔의 프로젝트를 불러온 후 해당 프로젝트에 SHA-1을 등록 해야 합니다. 이미 해결하셨으면 상관없지만 해결 못하셨으면 도움 됬길 바랍니다.
삭제재로그인할때는 처음처럼 구글계정이 안보이고 바로 로그인이 되는데 이거는 고치는 방법이 없나요?
답글삭제ㅠㅠㅠsignOut 함수에서 setResult와 finish에서 에러가 나는데 이 함수들은 어디에 선언되어있는건가요ㅠㅠ?
답글삭제