콘솔로 이동

Android에서 계정에 여러 인증 제공업체 연결하기

인증 제공업체의 사용자 인증 정보를 기존 사용자 계정에 연결하면 사용자가 여러 인증 제공업체를 통해 앱에 로그인할 수 있습니다. 사용자가 로그인할 때 어떤 인증 제공업체를 사용하든 동일한 Firebase 사용자 ID로 본인 확인이 가능합니다. 예를 들어 비밀번호로 로그인한 사용자가 Google 계정을 연결하면 나중에 비밀번호나 인증 제공업체 중 어느 방법으로든 로그인할 수 있습니다. 또는 익명 사용자가 Facebook 계정을 연결하면 나중에 Facebook으로 로그인해서 앱을 계속 사용할 수 있습니다.

시작하기 전에

앱에 2개 이상의 인증 제공업체(익명 인증 포함)에 대한 지원을 추가하세요.

사용자 계정에 인증 제공업체의 인증 정보 연결하기

다음과 같이 기존 사용자 계정에 인증 제공업체의 인증 정보를 연결합니다.

  1. 아무 인증 제공업체나 인증 방법을 사용해 사용자를 로그인 처리합니다.
  2. 새로운 인증 제공업체의 로그인 과정을 진행하되 FirebaseAuth.signInWith 메서드 호출 전까지만 진행합니다. 예를 들면 사용자의 Google ID 토큰, Facebook 액세스 토큰, 또는 이메일 주소와 비밀번호를 가져옵니다.
  3. 다음과 같이 새로운 인증 제공업체의 AuthCredential을 가져옵니다.

    Google 로그인

    자바

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    Facebook 로그인

    자바

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)
    이메일-비밀번호 로그인

    자바

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)
  4. 다음과 같이 AuthCredential 객체를 로그인한 사용자의 linkWithCredential 메서드에 전달합니다.

    자바

    mAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "linkWithCredential:success");
                        FirebaseUser user = task.getResult().getUser();
                        updateUI(user);
                    } else {
                        Log.w(TAG, "linkWithCredential:failure", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
    
                    // ...
                }
            });

    Kotlin

    auth.currentUser?.linkWithCredential(credential)
            ?.addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    Log.d(TAG, "linkWithCredential:success")
                    val user = task.result?.user
                    updateUI(user)
                } else {
                    Log.w(TAG, "linkWithCredential:failure", task.exception)
                    Toast.makeText(baseContext, "Authentication failed.",
                            Toast.LENGTH_SHORT).show()
                    updateUI(null)
                }
    
                // ...
            }

    인증 정보가 다른 사용자 계정에 이미 연결되어 있다면 linkWithCredential 호출이 실패합니다. 이 경우에는 앱에 맞게 중복 계정과 관련 데이터를 병합하는 과정을 처리해야 합니다.

    자바

    FirebaseUser prevUser = FirebaseAuth.getInstance().getCurrentUser();
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    FirebaseUser currentUser = task.getResult().getUser();
                    // Merge prevUser and currentUser accounts and data
                    // ...
                }
            });

    Kotlin

    val prevUser = FirebaseAuth.getInstance().currentUser
    mAuth.signInWithCredential(credential)
            .addOnSuccessListener { result ->
                val currentUser = result.user
                // Merge prevUser and currentUser accounts and data
                // ...
            }
            .addOnFailureListener {
                // ...
            }

linkWithCredential 호출이 성공하면 사용자가 연결된 인증 제공업체를 사용해 동일한 Firebase 데이터에 액세스할 수 있습니다.

인증 제공업체와 사용자 계정의 연결 해제하기

특정 인증 제공업체와 계정의 연결을 해제할 수 있습니다. 그러면 사용자가 제공업체로 로그인할 수 없습니다.

인증 제공업체와 사용자 계정의 연결을 해제하려면 제공업체 ID를 unlink 메서드에 전달합니다. 사용자 계정에 연결된 인증 제공업체 ID를 가져오려면 getProviderData를 호출합니다.

자바

mAuth.getCurrentUser().unlink(providerId)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // Auth provider unlinked from account
                    // ...
                }
            }
        });

Kotlin

mAuth.currentUser!!.unlink(providerId)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Auth provider unlinked from account
                // ...
            }
        }