You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose如何用Firebase Authentication实现Google/Facebook登录

Jetpack Compose 接入 Firebase 第三方(Google/Facebook)登录实现方案

你已经掌握Firebase邮箱密码认证的话,第三方登录的核心逻辑其实和邮箱认证共用同一套Firebase Auth逻辑,差异只在怎么拿第三方平台的身份凭证,下面是适配Jetpack Compose的无回调侵入实现,不用修改Host Activity代码。

前置准备

先在Firebase控制台对应项目的「认证-登录方式」页,开启Google、Facebook登录开关,按页面提示完成第三方平台的开发者配置:

  • Google登录不需要额外去Google开发者后台建应用,Firebase会自动关联,只要保存好配置页里的Web客户端ID即可
  • Facebook登录需要先去Facebook开发者平台创建应用,开启「Facebook登录」产品,把Firebase要求的AppID、App Secret填回Firebase配置页,再把Firebase给的OAuth回调地址填到Facebook平台的登录配置里

依赖配置

在模块级build.gradle.kts的dependencies块中添加依赖,你已经引入的Firebase BoM、auth库可以保留:

// Google登录
implementation("com.google.android.gms:play-services-auth:20.7.0")
// Facebook登录
implementation("com.facebook.android:facebook-login:16.0.1")
// Compose Activity Result 依赖(一般新建Compose项目默认自带,没有就加上)
implementation("androidx.activity:activity-compose:1.8.2")

Google登录实现

  1. 在登录页的Composable中,初始化GoogleSignIn客户端,用remember缓存实例避免重组重复创建:
@Composable
fun LoginScreen() {
    val context = LocalContext.current
    val auth = remember { FirebaseAuth.getInstance() }
    // 初始化Google登录配置
    val gso = remember {
        GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken("替换为你从Firebase控制台复制的Web客户端ID")
            .requestEmail()
            .build()
    }
    val googleSignInClient = remember { GoogleSignIn.getClient(context, gso) }
  1. 注册Activity Result启动器,接收Google登录的返回结果,转换为Firebase认证凭证:
val googleLoginLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.StartActivityForResult()
    ) { result ->
        if (result.resultCode == ComponentActivity.RESULT_OK) {
            val signInTask = GoogleSignIn.getSignedInAccountFromIntent(result.data)
            try {
                val account = signInTask.getResult(ApiException::class.java)
                // 生成Firebase认证凭证,后面的逻辑和邮箱登录完全一致
                val firebaseCredential = GoogleAuthProvider.getCredential(account.idToken, null)
                auth.signInWithCredential(firebaseCredential)
                    .addOnCompleteListener { task ->
                        if (task.isSuccessful) {
                            // 登录/注册成功,执行页面跳转等逻辑
                            val currentUser = auth.currentUser
                        } else {
                            // 处理认证失败逻辑,比如提示用户网络错误
                        }
                    }
            } catch (e: ApiException) {
                // 处理Google登录侧错误,比如用户取消登录、服务不可用
            }
        }
    }
  1. 自定义Compose样式的Google登录按钮,点击时触发登录流程即可:
Button(
        onClick = {
            googleLoginLauncher.launch(googleSignInClient.signInIntent)
        }
    ) {
        Text("使用Google账号登录")
    }
}

Facebook登录实现

  1. 先把Facebook开发者后台拿到的AppID、ClientToken配置到项目res/values/strings.xml中:
<string name="facebook_app_id">你的Facebook AppID</string>
<string name="facebook_client_token">你的Facebook Client Token</string>
  1. 在AndroidManifest.xml的application节点下添加Facebook要求的meta-data和ContentProvider配置,这部分和View体系的配置完全一致,直接抄Facebook后台给的配置即可。
  2. 回到登录页Composable,初始化Facebook回调管理器,注册登录回调:
@Composable
fun LoginScreen() {
    val context = LocalContext.current
    val auth = remember { FirebaseAuth.getInstance() }
    val callbackManager = remember { CallbackManager.Factory.create() }

    // 注册Facebook登录回调,在组件销毁时自动注销避免内存泄漏
    DisposableEffect(Unit) {
        val fbCallback = object : FacebookCallback<LoginResult> {
            override fun onSuccess(result: LoginResult) {
                // 拿Facebook返回的token生成Firebase凭证
                val firebaseCredential = FacebookAuthProvider.getCredential(result.accessToken.token)
                auth.signInWithCredential(firebaseCredential)
                    .addOnCompleteListener { task ->
                        if (task.isSuccessful) {
                            // 登录/注册成功逻辑
                        } else {
                            // 认证失败逻辑
                        }
                    }
            }
            override fun onCancel() { /* 用户取消登录,不用特殊处理 */ }
            override fun onError(error: FacebookException) { /* 登录错误提示 */ }
        }
        LoginManager.getInstance().registerCallback(callbackManager, fbCallback)
        onDispose {
            LoginManager.getInstance().unregisterCallback(callbackManager)
        }
    }
  1. 注册Activity Result启动器,接管Facebook的页面返回结果:
val fbLoginLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.StartActivityForResult()
    ) { result ->
        callbackManager.onActivityResult(result.resultCode, result.resultCode, result.data)
    }
  1. 自定义Compose样式的Facebook登录按钮,点击触发登录:
Button(
        onClick = {
            LoginManager.getInstance().logInWithReadPermissions(
                context as ComponentActivity,
                callbackManager,
                listOf("email", "public_profile")
            )
        }
    ) {
        Text("使用Facebook账号登录")
    }
}

注意事项

  1. 两种第三方登录的Firebase侧逻辑完全通用,新用户首次通过第三方登录时,Firebase会自动创建对应用户条目,不需要额外写注册接口,和你之前实现的邮箱密码账号共用同一个用户池,AuthStateListener的用户状态监听逻辑不需要修改。
  2. Google登录一定不要用Android客户端ID生成idToken,必须用Firebase配置页里的Web客户端ID,否则会一直报凭证无效错误。
  3. Facebook开发阶段需要把测试机的密钥哈希添加到Facebook开发者后台的应用配置里,否则会出现登录成功但回调失败的问题。
  4. 所有回调都通过Compose自带的Activity Result API处理,不需要在Host Activity中重写onActivityResult方法,完全符合单Activity+Compose的开发规范。

内容的提问来源于stack exchange,提问作者Moon Sculptor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:09:09