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登录实现
- 在登录页的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) }
- 注册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登录侧错误,比如用户取消登录、服务不可用 } } }
- 自定义Compose样式的Google登录按钮,点击时触发登录流程即可:
Button( onClick = { googleLoginLauncher.launch(googleSignInClient.signInIntent) } ) { Text("使用Google账号登录") } }
Facebook登录实现
- 先把Facebook开发者后台拿到的AppID、ClientToken配置到项目
res/values/strings.xml中:
<string name="facebook_app_id">你的Facebook AppID</string> <string name="facebook_client_token">你的Facebook Client Token</string>
- 在
AndroidManifest.xml的application节点下添加Facebook要求的meta-data和ContentProvider配置,这部分和View体系的配置完全一致,直接抄Facebook后台给的配置即可。 - 回到登录页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) } }
- 注册Activity Result启动器,接管Facebook的页面返回结果:
val fbLoginLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartActivityForResult() ) { result -> callbackManager.onActivityResult(result.resultCode, result.resultCode, result.data) }
- 自定义Compose样式的Facebook登录按钮,点击触发登录:
Button( onClick = { LoginManager.getInstance().logInWithReadPermissions( context as ComponentActivity, callbackManager, listOf("email", "public_profile") ) } ) { Text("使用Facebook账号登录") } }
注意事项
- 两种第三方登录的Firebase侧逻辑完全通用,新用户首次通过第三方登录时,Firebase会自动创建对应用户条目,不需要额外写注册接口,和你之前实现的邮箱密码账号共用同一个用户池,AuthStateListener的用户状态监听逻辑不需要修改。
- Google登录一定不要用Android客户端ID生成idToken,必须用Firebase配置页里的Web客户端ID,否则会一直报凭证无效错误。
- Facebook开发阶段需要把测试机的密钥哈希添加到Facebook开发者后台的应用配置里,否则会出现登录成功但回调失败的问题。
- 所有回调都通过Compose自带的Activity Result API处理,不需要在Host Activity中重写
onActivityResult方法,完全符合单Activity+Compose的开发规范。
内容的提问来源于stack exchange,提问作者Moon Sculptor
相关产品推荐
相关产品推荐

