안드로이드

안드로이드 페이스북로그인 파이어베이스 인증기능과 연동

알통몬_ 2019. 6. 19. 10:15
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


제목 그대로 안드로이드에서 유명한 소셜 로그인 중 하나인 페이스북 로그인을

구글에서 제공하는 파이어베이스 인증 Authentication 에 연결하는 방법에 대해

포스팅합니다.


1. 먼저 당연히 페이스북 로그인 기능을 구현해야겠죠?

2017/10/17 - [안드로이드] - 안드로이드 페이스북 로그인 기능 구현하기 android app facebook login

그리고 파이어베이스에도 당연히 안드로이드 프로젝트가 추가되어있어야 합니다.


2. 앱ID 와 시크릿 코드 확인하기

https://developers.facebook.com/

위 페이스북 개발자 사이트에 가서 방금 만든 앱에 들어가시고

앱ID와 앱 시크릿 코드를 메모장에 저장해놓습니다.


3. 파이어베이스 인증에서 로그인방법 탭으로 가서 페이스북로그인을 허용

메모장에 입력해놓은 앱 ID와 시크릿 코드를 파이어베이스 프로젝트에 추가해줍니다.

그리고 아래 리다이렉션 URI를 복사합니다.


4. OAuth  리다이렉션 URI를 Facebook 앱 구성에 추가

페이스북 앱 설정에서 제품 탭에 Facebook 로그인 탭을 열어 설정으로 가셔서

유효한 OAuth 리다이렉션 URI 에 3번에서 복사한 URI를 넣어줍니다.

*추가하고 꼭 변경 내용저장을 눌러주어야 합니다.


여기까지 하셨다면 이제 파이어베이스 인증 탭에서 페이스북 로그인한 사용자도

확인할 수 있습니다.


그럼 이제 안드로이드 프로젝트에서 페이스북 로그인 후 파이어베이스에 접근하는 

코드도 필요하겠죠?


5. 페이스북 로그인 코드 구현

기본페이스북 로그인 기능은 구현했다고 가정했으니, 생략합니다.

그리고 파이어베이스 연동도 이미 되어있으니 생략합니다.


자바 코드만 보도록하겠습니다.

FacebookLoginRequest.java 

(FacebookCallback 인터페이스를 구현한 커스텀클래스입니다.)

public class FacebookLoginRequest implements FacebookCallback<LoginResult> {
private static final String TAG = FacebookLoginRequest.class.getSimpleName();
private FirebaseAuth mFirebaseAuth;
private FirebaseUser mFirebaseUser;
private LoginActivity activity;

public FacebookLoginRequest(LoginActivity activity) {
this.activity = activity;
mFirebaseAuth = FirebaseAuth.getInstance();
}

@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "facebook:onSuccess:" + loginResult);
handleFacebookAccessToken(loginResult.getAccessToken());
}

@Override
public void onCancel() {
Log.d(TAG, "facebook:onCancel:");
}

@Override
public void onError(FacebookException error) {
Log.d(TAG, "facebook:onError:" + error.getMessage());
}
private void handleFacebookAccessToken(AccessToken token) {
Log.d(TAG, "handleFacebookAccessToken : " + token);

activity.showProgresDialog();

AuthCredential authCredential = FacebookAuthProvider.getCredential(token.getToken());
mFirebaseAuth.signInWithCredential(authCredential)
.addOnCompleteListener(activity, task -> {

if(task.isSuccessful()) {
assert task.getResult() != null;
String provider = task.getResult().getCredential().getProvider();
Log.d(TAG, "facebook - signInWithCredential:success");
mFirebaseUser = mFirebaseAuth.getCurrentUser();
activity.checkUser(mFirebaseUser, provider);
} else {
Log.w(TAG, "facebook - signInWithCredential:failure", task.getException());
Toast.makeText(activity, "facebook - Authentication Failed.", Toast.LENGTH_SHORT).show();
activity.checkUser(null, null);
}

activity.hideProgressDialog();
});
}


}


LoginActivity.java

public class LoginActivity extends BaseActivity {

private static final String TAG = LoginActivity.class.getSimpleName();
public static final int FACEBOOK_LOGIN_IN = 64206;

private ActivityLoginBinding binding;

private FirebaseAuth mFirebaseAuth;

CallbackManager mCallbackManager;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_login);

mFirebaseAuth = FirebaseAuth.getInstance();
mCallbackManager = CallbackManager.Factory.create();
binding.googleSignInBtn.setOnClickListener(this::signIn);
binding.facebookSIgnInBtn.setOnClickListener(this::signIn);

}


@Override
protected void onStart() {
super.onStart();
FirebaseUser firebaseUser = mFirebaseAuth.getCurrentUser();
checkUser(firebaseUser, null);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
Log.d(TAG, "requestCode = " + requestCode);
if(requestCode == FACEBOOK_LOGIN_IN){
mCallbackManager.onActivityResult(requestCode, resultCode, data);
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}

private void signIn(View view) {
switch (view.getId()) {
case R.id.facebookSIgnInBtn:
binding.facebookSIgnInBtn.setPermissions(getString(R.string.facebook_login_key),

getString(R.string.facebook_login_value));
binding.facebookSIgnInBtn.registerCallback(mCallbackManager, new FacebookLoginRequest(this));
break;
}
}

public void checkUser(FirebaseUser user, String provider) {
hideProgressDialog();
if (user != null) {
if(provider != null) {
SharedPreferences sharedPreferences = getSharedPreferences(getString(R.string.login_name), MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(getString(R.string.login_provider), provider);
editor.apply();
}
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}

}


이상입니다. 궁금하신 부분은 댓글남겨주세요.

https://firebase.google.com/docs/auth/android/facebook-login?authuser=0

공식문서도 참고하시면 좋습니다.

반응형