brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Aug 24. 2016

Firebase #06-3

Authentication

Authenticate with Firebase Anonymously on Android



Firebase Authenticaion은 임시 익명 계정을 만들어 Firebase로 인증하는데 이용할 수 있습니다.

이러한 임시 익명 계정은 아직 앱에 가입하지 않은 사용자가 보안 규칙에 의해 보호되는 데이터로 작업할 수 있도록 하는 데 사용할 수 있습니다.

만약 익명 사용자가 앱에 가입하기로 결심하면, 익명 계정에 그들의 로그인 credential을 연결하여, 향후 세션에서도 보호되고 있는 데이터들을 이용해 계속 작업을 할 수 있습니다.


https://firebase.google.com/docs/auth/android/anonymous-auth



1. google-service.json 추가

#01 구성 파일 복사


2. plugin 추가

#02 Project build.gradle에 추가
buildscript {
    ...
    dependencies {
        ...
        classpath 'com.google.gms:google-services:3.0.0'
    }
}
#03 app build.gradle에 추가
apply plugin: 'com.android.application'

...

dependencies {
    ...
    compile 'com.google.firebase:firebase-auth:9.4.0'
    compile 'com.google.android.gms:play-services-auth:9.4.0'
}

apply plugin: 'com.google.gms.google-services'


3. Enable Anonymous auth in Firebase console


'Firebase Auth - 로그인 방법'에서 '익명'을 활성화합니다. 

#04 익명 사용 설정


4. Sign In Anonymously


private void signInAnonymously() {
    mFirebaseAuth.signInAnonymously()
        .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (!task.isSuccessful()) {
                        // fail
                    } else {
                       // success
                    }
                }
            });
}
#05 익명 사용자


5. Convert an anonymous account to a permanent account


익명 사용자가 앱에 가입하면, 그들의 새로운 계정으로 작업을 계속할 수 있도록 할 수 있습니다.

private void convertToPermanentAccount() {
//  AuthCredential credential = GoogleAuthProvider.getCredential(Token, null);
//  AuthCredential credential = FacebookAuthProvider.getCredential(t.getToken());
        String email = "anonymoustest@test.com";
        String password = "123456";
        AuthCredential credential = EmailAuthProvider.getCredential(email, password);

        mFirebaseAuth.getCurrentUser().linkWithCredential(credential)
           .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (!task.isSuccessful()) {
                            // fail
                        } else {
                            // success
                        }
                    }
                });
    }

익명 사용자를 영구 사용자로 전환 시, 동일한 사용자 UID를 이용하고 있습니다.

#06 익명 사용자 >> 영구 사용자 전환




Link Multiple Auth Providers to an Account



기존 사용자 계정에 인증 공급자 credential 연결하여 다수의 인증 공급자를 통해 앱에 로그인할 수 있습니다. 사용자들은 로그인했던 인증 공급자에 상관없이 동일한 Firebase 사용자 ID에 의해 식별됩니다.

예를 들어, 비밀번호로 가입된 사용자가 Google 계정으로 연결해 로그인하거나 익명 사용자가 Facebook 계정으로 연결해, Facebook을 통해 로그인할 수 있습니다.


https://firebase.google.com/docs/auth/android/account-linking



1. google-service.json 추가

#01 구성 파일 복사


2. plugin 추가

#02 Project build.gradle에 추가
buildscript {
    ...
    dependencies {
        ...
        classpath 'com.google.gms:google-services:3.0.0'
    }
}
#03 app build.gradle에 추가
apply plugin: 'com.android.application'

...

dependencies {
    ...
    compile 'com.google.firebase:firebase-auth:9.4.0'
    compile 'com.google.android.gms:play-services-auth:9.4.0'
}

apply plugin: 'com.google.gms.google-services'


3. Link auth provider credentials to a user account


이 전에 , 앱에 2개 이상의 인증 공급자(가능하면 익명 인증을 포함한)에 대한 지원을 추가해야 합니다.

인증 공급자 자격 증명을 기존 사용자 계정에 연결하려면:

인증 공급자나 메소드를 이용해 사용자 로그인을 합니다.

새로운 인증 공급자를 위해 FirebaseAuth.signInWith 메소드를 제외한 로그인 flow를 완료해야 합니다. 예를 들어, 사용자의 구글 ID 토큰, 페이스북 접근 토큰, 또는 이메일과 비밀번호입니다.

새 인증 공급자를 위해 AuthCredential을 얻습니다. 

// Google Sign-In
AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);

// Facebook Login
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());

// Email-password sign-in
AuthCredential credential = EmailAuthProvider.getEmailAuthCredential(email, password);

AuthCredential 객체를 사용자의 linkWithCredential 메소드에 전달합니다.

    private void link() {
        String email = "anonymoustest@test.com";
        String password = "123456";
        AuthCredential credential = EmailAuthProvider.getCredential(email, password);

        mFirebaseAuth.getCurrentUser().linkWithCredential(credential)
           .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (!task.isSuccessful()) {
                            // fail
                        } else {
                           // success
                        }
                    }
                });
    }


4. Unlink an auth provider from a user account


사용자가 더 이상 공급자에 로그인하지 않도록, 계정에서 연결을 해제할 수 있습니다.

이를 위해 연결 해제 메소드에 공급자 ID를 전달해야 합니다.

private void unlink() {
    if (mFirebaseAuth.getCurrentUser() != null) {
        String providerId = mFirebaseAuth.getCurrentUser().getProviderId();
        FirebaseAuth.getInstance().getCurrentUser().unlink(providerId)
           .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (!task.isSuccessful()) {
                            // fail
                        } else {
                            // success
                        }
                    }
                });
    }
}




Sample


https://github.com/oemilk/firebase/tree/master/app/src/main/java/com/sh/firebase/authentication



작가의 이전글 Firebase #06-2
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari