Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

FirebaseUI를 사용하여 Android 앱에 쉽게 로그인 추가

FirebaseUI 는 앱에서 사용할 드롭인 UI 흐름을 제공하는 Firebase 인증 SDK 위에 구축된 라이브러리입니다. FirebaseUI는 다음과 같은 이점을 제공합니다.

  • 다중 공급자 - 이메일/비밀번호, 이메일 링크, 전화 인증, Google 로그인, Facebook 로그인, Twitter 로그인 및 GitHub 로그인을 위한 로그인 흐름입니다.
  • 계정 관리 - 계정 생성 및 암호 재설정과 같은 계정 관리 작업을 처리하는 흐름입니다.
  • 계정 연결 - ID 공급자 간에 사용자 계정을 안전하게 연결하기 위한 흐름입니다.
  • 익명 사용자 업그레이드 - 익명 사용자를 안전하게 업그레이드하는 흐름입니다.
  • 맞춤 테마 - 앱에 맞게 FirebaseUI의 모양을 맞춤설정합니다. 또한 FirebaseUI는 오픈 소스이므로 프로젝트를 포크하고 필요에 맞게 정확하게 맞춤설정할 수 있습니다.
  • 암호 대용 Smart Lock - 빠른 장치 간 로그인을 위해 암호 대용 Smart Lock 과 자동 통합됩니다.

시작하기 전에

  1. 아직 추가하지 않았다면 Android 프로젝트에 Firebase를 추가합니다 .

  2. 앱 수준 build.gradle 파일에 FirebaseUI의 종속성을 추가합니다. Facebook 또는 Twitter를 통한 로그인을 지원하려면 Facebook 및 Twitter SDK도 포함하십시오.

    dependencies {
        // ...
    
        implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
    
        // Required only if Facebook login support is required
        // Find the latest Facebook SDK releases here: https://goo.gl/Ce5L94
        implementation 'com.facebook.android:facebook-android-sdk:8.x'
    }
    

    FirebaseUI 인증 SDK에는 Firebase SDK 및 Google Play 서비스 SDK에 대한 전이적 종속성이 있습니다.

  3. Firebase 콘솔 에서 인증 섹션을 열고 지원하려는 로그인 방법을 사용 설정합니다. 일부 로그인 방법에는 일반적으로 서비스의 개발자 콘솔에서 제공되는 추가 정보가 필요합니다.

  4. Google 로그인을 지원하고 앱의 SHA-1 지문을 아직 지정하지 않은 경우 Firebase 콘솔의 설정 페이지 에서 지정하세요. 앱의 SHA-1 지문을 얻는 방법에 대한 자세한 내용은 클라이언트 인증 을 참조하세요.

  5. Facebook 또는 Twitter를 통한 로그인을 지원하는 경우 각 공급자가 요구하는 식별 정보를 지정하는 문자열 리소스를 strings.xml 에 추가합니다.

    
    <resources>
      <!-- Facebook application ID and custom URL scheme (app ID prefixed by 'fb'). -->
      <string name="facebook_application_id" translatable="false">YOUR_APP_ID</string>
      <string name="facebook_login_protocol_scheme" translatable="false">fbYOUR_APP_ID</string>
    </resources>
    

로그인

FirebaseUI 활동 결과 계약에 대한 콜백을 등록하는 ActivityResultLauncher 를 만듭니다.

Kotlin+KTX

// See: https://developer.android.com/training/basics/intents/result
private val signInLauncher = registerForActivityResult(
        FirebaseAuthUIActivityResultContract()
) { res ->
    this.onSignInResult(res)
}

Java

// See: https://developer.android.com/training/basics/intents/result
private final ActivityResultLauncher<Intent> signInLauncher = registerForActivityResult(
        new FirebaseAuthUIActivityResultContract(),
        new ActivityResultCallback<FirebaseAuthUIAuthenticationResult>() {
            @Override
            public void onActivityResult(FirebaseAuthUIAuthenticationResult result) {
                onSignInResult(result);
            }
        }
);

FirebaseUI 로그인 흐름을 시작하려면 선호하는 로그인 방법으로 로그인 인텐트를 만듭니다.

Kotlin+KTX

// Choose authentication providers
val providers = arrayListOf(
        AuthUI.IdpConfig.EmailBuilder().build(),
        AuthUI.IdpConfig.PhoneBuilder().build(),
        AuthUI.IdpConfig.GoogleBuilder().build(),
        AuthUI.IdpConfig.FacebookBuilder().build(),
        AuthUI.IdpConfig.TwitterBuilder().build())

// Create and launch sign-in intent
val signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .build()
signInLauncher.launch(signInIntent)

Java

// Choose authentication providers
List<AuthUI.IdpConfig> providers = Arrays.asList(
        new AuthUI.IdpConfig.EmailBuilder().build(),
        new AuthUI.IdpConfig.PhoneBuilder().build(),
        new AuthUI.IdpConfig.GoogleBuilder().build(),
        new AuthUI.IdpConfig.FacebookBuilder().build(),
        new AuthUI.IdpConfig.TwitterBuilder().build());

// Create and launch sign-in intent
Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .build();
signInLauncher.launch(signInIntent);

로그인 흐름이 완료되면 onSignInResult 에서 결과를 받게 됩니다.

Kotlin+KTX

private fun onSignInResult(result: FirebaseAuthUIAuthenticationResult) {
    val response = result.idpResponse
    if (result.resultCode == RESULT_OK) {
        // Successfully signed in
        val user = FirebaseAuth.getInstance().currentUser
        // ...
    } else {
        // Sign in failed. If response is null the user canceled the
        // sign-in flow using the back button. Otherwise check
        // response.getError().getErrorCode() and handle the error.
        // ...
    }
}

Java

private void onSignInResult(FirebaseAuthUIAuthenticationResult result) {
    IdpResponse response = result.getIdpResponse();
    if (result.getResultCode() == RESULT_OK) {
        // Successfully signed in
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        // ...
    } else {
        // Sign in failed. If response is null the user canceled the
        // sign-in flow using the back button. Otherwise check
        // response.getError().getErrorCode() and handle the error.
        // ...
    }
}

로그인 방법 설정

  1. Firebase 콘솔 에서 인증 섹션을 엽니다. 로그인 방법 탭에서 이메일/암호 공급자를 활성화합니다. 이메일 링크 로그인을 사용하려면 이메일/비밀번호 로그인이 활성화되어 있어야 합니다.

  2. 같은 섹션에서 이메일 링크(암호 없는 로그인) 로그인 방법을 활성화하고 저장 을 클릭합니다.

  3. 또한 이메일 링크 로그인을 사용하려면 Firebase 동적 링크를 활성화해야 합니다. Firebase 콘솔 에서 탐색 표시줄의 참여 아래에 있는 동적 링크 를 클릭합니다. 시작하기 를 클릭하고 도메인을 추가합니다. 여기에서 선택한 도메인은 사용자에게 전송되는 이메일 링크에 반영됩니다.

  4. enableEmailLinkSignIn 인스턴스에서 EmailBuilder 을 호출하여 FirebaseUI에서 이메일 링크 로그인을 사용 설정할 수 있습니다. 또한 setHandleCodeInApp 이 true로 설정된 유효한 ActionCodeSettings 객체를 제공해야 합니다. 또한 setUrl 에 전달하는 URL을 허용 목록에 추가해야 합니다. 이 작업은 Firebase 콘솔 의 인증 -> 로그인 방법 -> 승인된 도메인에서 수행할 수 있습니다.

    Kotlin+KTX

    val actionCodeSettings = ActionCodeSettings.newBuilder()
            .setAndroidPackageName( /* yourPackageName= */
                    "...",  /* installIfNotAvailable= */
                    true,  /* minimumVersion= */
                    null)
            .setHandleCodeInApp(true) // This must be set to true
            .setUrl("https://google.com") // This URL needs to be whitelisted
            .build()
    
    val providers = listOf(
            EmailBuilder()
                    .enableEmailLinkSignIn()
                    .setActionCodeSettings(actionCodeSettings)
                    .build()
    )
    val signInIntent = AuthUI.getInstance()
            .createSignInIntentBuilder()
            .setAvailableProviders(providers)
            .build()
    signInLauncher.launch(signInIntent)

    Java

    ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder()
            .setAndroidPackageName(
                    /* yourPackageName= */ "...",
                    /* installIfNotAvailable= */ true,
                    /* minimumVersion= */ null)
            .setHandleCodeInApp(true) // This must be set to true
            .setUrl("https://google.com") // This URL needs to be whitelisted
            .build();
    
    List<AuthUI.IdpConfig> providers = Arrays.asList(
            new AuthUI.IdpConfig.EmailBuilder()
                    .enableEmailLinkSignIn()
                    .setActionCodeSettings(actionCodeSettings)
                    .build()
    );
    Intent signInIntent = AuthUI.getInstance()
            .createSignInIntentBuilder()
            .setAvailableProviders(providers)
            .build();
    signInLauncher.launch(signInIntent);
  5. 특정 활동에서 링크를 잡으려면 여기 에 설명된 단계를 따르십시오. 그렇지 않으면 링크가 런처 활동으로 리디렉션됩니다.

  6. 딥 링크를 포착하면 저희가 대신 처리할 수 있는지 전화로 확인해야 합니다. 가능한 경우 setEmailLink 를 통해 전달해야 합니다.

    Kotlin+KTX

    if (AuthUI.canHandleIntent(intent)) {
        val extras = intent.extras ?: return
        val link = extras.getString("email_link_sign_in")
        if (link != null) {
            val signInIntent = AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setEmailLink(link)
                    .setAvailableProviders(providers)
                    .build()
            signInLauncher.launch(signInIntent)
        }
    }

    Java

    if (AuthUI.canHandleIntent(getIntent())) {
        if (getIntent().getExtras() == null) {
            return;
        }
        String link = getIntent().getExtras().getString("email_link_sign_in");
        if (link != null) {
            Intent signInIntent = AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setEmailLink(link)
                    .setAvailableProviders(providers)
                    .build();
            signInLauncher.launch(signInIntent);
        }
    }
  7. 선택적 교차 장치 이메일 링크 로그인이 지원됩니다. 즉, Android 앱을 통해 전송된 링크를 사용하여 웹 또는 Apple 앱에 로그인할 수 있습니다. 기본적으로 교차 장치 지원이 활성화되어 있습니다. EmailBuilder 인스턴스에서 setForceSameDevice 를 호출하여 비활성화할 수 있습니다.

    자세한 내용은 FirebaseUI-WebFirebaseUI-iOS 를 참조하세요.

로그아웃

FirebaseUI는 Firebase 인증 및 모든 소셜 ID 제공업체에서 로그아웃할 수 있는 편리한 방법을 제공합니다.

Kotlin+KTX

AuthUI.getInstance()
        .signOut(this)
        .addOnCompleteListener {
            // ...
        }

Java

AuthUI.getInstance()
        .signOut(this)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            public void onComplete(@NonNull Task<Void> task) {
                // ...
            }
        });

사용자 계정을 완전히 삭제할 수도 있습니다.

Kotlin+KTX

AuthUI.getInstance()
        .delete(this)
        .addOnCompleteListener {
            // ...
        }

Java

AuthUI.getInstance()
        .delete(this)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                // ...
            }
        });

커스터마이징

기본적으로 FirebaseUI는 테마 지정에 AppCompat을 사용합니다. 즉, 자연스럽게 앱의 색 구성표를 채택합니다. 추가 사용자 지정이 필요한 경우 테마 및 로고를 로그인 Intent 빌더에 전달할 수 있습니다.

Kotlin+KTX

val signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setLogo(R.drawable.my_great_logo) // Set logo drawable
        .setTheme(R.style.MySuperAppTheme) // Set theme
        .build()
signInLauncher.launch(signInIntent)

Java

Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setLogo(R.drawable.my_great_logo)      // Set logo drawable
        .setTheme(R.style.MySuperAppTheme)      // Set theme
        .build();
signInLauncher.launch(signInIntent);

맞춤형 개인 정보 보호 정책 및 서비스 약관을 설정할 수도 있습니다.

Kotlin+KTX

val signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setTosAndPrivacyPolicyUrls(
                "https://example.com/terms.html",
                "https://example.com/privacy.html")
        .build()
signInLauncher.launch(signInIntent)

Java

Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setTosAndPrivacyPolicyUrls(
                "https://example.com/terms.html",
                "https://example.com/privacy.html")
        .build();
signInLauncher.launch(signInIntent);

다음 단계

  • FirebaseUI 사용 및 맞춤설정에 대한 자세한 내용은 GitHub의 README 파일을 참조하세요.
  • FirebaseUI에서 문제를 발견하고 보고하려면 GitHub 문제 추적기 를 사용하세요.