본문 바로가기
Study/Android

Firebase 인증 1-Facebook 인증

by Answer Choi 2017. 9. 7.
반응형


Firebase는 구글에서 인수한 기업으로 실시간 데이터베이스, 인증, 클라우드 스토리지등 


앱 개발자는 앱만 신경쓰도록 나머지 부분을 제공해 줍니다.



우선 인증부터 해볼텐데 인증은 무료로 이용을 하실 수 있으며, 구글+, 페이스북, 트위터, 깃허브,


이메일, SMS, 익명인증등 여러방법을 제공합니다.


Firebase(https://firebase.google.com/products/auth/)


저번에 Facebook인증을 해보았으니 Facebook인증만 Firebase에 묶어서 해보겠습니다.


Facebook 사용자 인증은 Facebook으로 사용자인증하기 를 참고하세요.


우선 Firebase console로 이동합니다.



프로젝트 추가를 눌러 새로운 프로젝트를 추가합니다.



프로젝트 이름과 지역을 선택한 후 프로젝트 만들기를 클릭합니다.



왼쪽 탭 Overview를 선택한 뒤 오른쪽에서 Android 앱에 Firebase추가를 클릭합니다.



각자의 안드로이드 앱 패키지 이름과 닉네임 그리고 서명인증서를 등록합니다.


서명인증서는 keytool을 이용하면 됩니다.

MAC/LINUX의 경우



WINDOWS의 경우



위 키중 SHA1을 인증서에 넣어주고 앱등록을 합니다.



json 파일을 다운로드하면 앞에서 등록했던 앱정보들을 파일로 다운로드 받을 수 있습니다.



다운받은 json파일을 app 루트에 복사합니다.


위와같은 폴더구조가 나오지 않으면 바로 위 메뉴에서 Project Files를 선택하면 나옵니다.



이제 gradle에 추가해 줍니다.


project의 gradle



app의 gradle


그리고 Sync Now를 눌러 sdk를 app과 동기화합니다.


PS. 만약 동기화시 아래의 오류 메세지가 나타난다면


Error:Execution failed for task ':app:processDebugGoogleServices'.

> No matching client found for package name 'com.answerofgod.logintest'


JSON파일이 해당앱과 패키지 이름이 같은지 확인하셔야 합니다.



동기화가 정상적으로 완료가 되었으면 Firebase 콘솔로 돌아와 인증(Authentication)탭을 선택합니다.


그리고 로그인 방법 설정을 클릭합니다.



우리는 Facebook으로 인증을 할 것이므로, 로그인 제공업체에서 Facebook을 선택합니다.



사용설정을 ON 하면 앱ID앱 비밀번호를 요구합니다.


이제 Facebook개발자 센터으로 이동합니다.



로그인 하시고 해당앱을 만드셨으면 대시보드로 갑니다.


대시보드에서 앱ID앱 시크릿 코드를 복사해서 Firebase에 넣어줍니다.



마지막으로 Firebase의 OAuth 리디렉션 URI를 복사해서


Facebook 로그인 - 설정 - 유효한 OAuth 리디렉션 URI에 넣습니다.



Firebase로 돌아와 저장을 하면 Facebook이 사용 설정됨으로 바뀝니다.


이제 콘솔에서의 작업은 끝났습니다.


안드로이드 스튜디오로 돌아갑니다.



app gradle에 Firebase auth 라이브러리를 추가해 줍니다.


1
compile 'com.google.firebase:firebase-auth:10.2.1'
cs



Sync Now를 한 후 Java code로 넘어옵니다.



만약 위와 같이 R 을 인식못할 경우 gradle에서  plugin의 순서를 바꿔주세요.



위와 같이 google-services를 제일 위로 올려주세요.



FirebaseUser와 FirebaseAuth를 선언합니다.


1
2
private FirebaseUser mUser;
private FirebaseAuth mAuth;
cs




onCreate할때 Firebase 공유 인스턴스를 가져오고, 사용자가 현재 로그인되어 있는지 확인합니다.


1
2
3
4
5
6
if (mUser != null) {
    Log.e("mUser",mUser.getUid());
    login();
}else{
    Log.e("mUser","null");
}
cs


로그인이 되어있다면 mUser가 null이 아니므로 로그인 프로세스를 따르게 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void login(){
    try{
        for (UserInfo profile : mUser.getProviderData()) {
            // Id of the provider (ex: google.com)
            String providerId = profile.getProviderId();
            // UID specific to the provider
            final String uid = profile.getUid();
 
            // Name, email address, and profile photo Url
            final String name = profile.getDisplayName();
            final String email = profile.getEmail();
            final Uri photoUrl = profile.getPhotoUrl();
            Log.e("profile", providerId + " " + uid + " " + name + " " + email + " " + photoUrl);
            Toast.makeText(this,"성공적으로 로그인 되었습니다.",Toast.LENGTH_SHORT).show();
        }
    }catch(Exception e){
        Log.e("login",e.toString());
    }
}
cs


Line 3~15 :로그인시에는 Firebase와 연결되어 있는 계정의 정보를 가져오게 됩니다.


providerId는 로그인 제공자 이름, uid는 ID, name은 사용자이름, email은 사용자 이메일입니다.


firebase에 등록된 정보도 포함됩니다.


만약 위에서 로그인이 안되어 있는경우(첫 실행시 or 그전에 로그아웃 한 경우)에는 


로그인이 되지않고, Facebook으로 계속하기(Continue with Facebook) 버튼이 나타납니다.


이경우 버튼을 눌러 로그인을 하게되면 권한을 물어보고 성공시 facebook callback 함수 중 


onSuccess가 호출됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public void onSuccess(LoginResult loginResult) {
 
    handleFacebookAccessToken(loginResult.getAccessToken());
}
@Override
public void onCancel() {
    // App code
}
@Override
public void onError(FacebookException exception) {
    // App code
}
cs


onSuccess에서는 loginResult에서 accessToken을 가져와 handleFacebookAccessToken을 호출합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private void handleFacebookAccessToken(AccessToken token) {
    Log.e("AccessToken""handleFacebookAccessToken:" + token);
 
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(thisnew OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.e("AccessToken""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()) {
                        Toast.makeText(getApplication(), "Authentication failed.",Toast.LENGTH_SHORT).show();
                    }else{
                        mUser = mAuth.getCurrentUser();
                        if (mUser != null) {
                            Log.e("mUser",mUser.getUid());
                            login();
                        }else{
                            Log.e("mUser","user is null");
                        }
                    }
                }
            });
}
cs


여기서는 가져온 token으로 Firebase 사용자인증 정보를 교환하고 인증정보를 사용해 firebase에 인증합니다.


첫로그인인 경우 사용자계정을 만들게 됩니다.


firebase 계정정보



만약 인증이 실패할경우 Line 14~15로 빠지게 되고, 성공하면 Line 16~24로 빠집니다.


Line 16~24에서는 mUser가 널이 아닌경우 login함수를 호출합니다.



로그메세지를 보게되면 mUser는 Firebase의 ID입니다.


그리고 login함수 안의 for문을 통해 가져온 사용자 정보가 밑에 출력됩니다.


처음은 provider가 firebase인 것부터 나오고, 그다음은 facebook인 정보를 가져옵니다.



login 함수까지 성공적으로 진행되면 Toast 메세지가 나타나게 됩니다.




다음엔 모든 인증을 통합으로 해보겠습니다.

반응형

인기글