Flutter + Firebase Auth 跨平台登录集成指南

1. 前置配置

Firebase 项目设置:

  1. Firebase 控制台 创建新项目
  2. 添加应用平台:
    • Android:填写包名(如 com.example.app),下载 google-services.json
    • iOS:填写 Bundle ID,下载 GoogleService-Info.plist
    • Web:注册应用获取配置片段

Flutter 依赖:

dependencies:
  firebase_core: ^2.24.0
  firebase_auth: ^4.18.1
  google_sign_in: ^6.1.1  # 如需 Google 登录

2. 平台配置

Android:

  1. google-services.json 放入 android/app/
  2. android/build.gradle
dependencies {
  classpath 'com.google.gms:google-services:4.3.15'
}

  1. android/app/build.gradle
apply plugin: 'com.google.gms.google-services'

iOS:

  1. GoogleService-Info.plist 拖入 Xcode 工程
  2. ios/Podfile
target 'Runner' do
  use_frameworks!
  pod 'Firebase/Auth'
end

Web: web/index.html<body> 中添加:

<script src="https://www.gstatic.com/firebasejs/10.7.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/10.7.1/firebase-auth.js"></script>
<script>
  const firebaseConfig = { /* 你的 web 配置 */ };
  firebase.initializeApp(firebaseConfig);
</script>

3. 核心登录实现

初始化 Firebase:

import 'package:firebase_core/firebase_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

邮箱密码登录:

Future<UserCredential> signInWithEmail(String email, String password) async {
  return await FirebaseAuth.instance.signInWithEmailAndPassword(
    email: email,
    password: password,
  );
}

Google 登录(跨平台):

Future<UserCredential> signInWithGoogle() async {
  final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn();
  final GoogleSignInAuthentication? googleAuth = 
      await googleUser?.authentication;
  
  final credential = GoogleAuthProvider.credential(
    accessToken: googleAuth?.accessToken,
    idToken: googleAuth?.idToken,
  );
  
  return await FirebaseAuth.instance.signInWithCredential(credential);
}

4. 状态管理

监听认证状态:

FirebaseAuth.instance.authStateChanges().listen((User? user) {
  if (user == null) {
    print('用户未登录');
  } else {
    print('用户已登录: ${user.uid}');
  }
});

获取当前用户:

User? user = FirebaseAuth.instance.currentUser;
if (user != null) {
  print('用户ID: ${user.uid}');
  print('邮箱: ${user.email}');
}

5. 平台特定处理

iOS 额外配置:

  • 在 Xcode 中开启 Keychain Sharing
  • 添加 URL SchemeGoogleService-Info.plist 中的 REVERSED_CLIENT_ID

Web 重定向处理:

// 在 web 平台初始化时设置
if (kIsWeb) {
  await FirebaseAuth.instance.setPersistence(Persistence.LOCAL);
}

6. 错误处理示例
try {
  await signInWithEmail(email, password);
} on FirebaseAuthException catch (e) {
  if (e.code == 'user-not-found') {
    print('用户不存在');
  } else if (e.code == 'wrong-password') {
    print('密码错误');
  }
}

7. 完整登录流程示例
import 'package:firebase_auth/firebase_auth.dart';

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance;

  // 登录状态流
  Stream<User?> get user => _auth.authStateChanges();

  // 邮箱注册
  Future<User?> registerWithEmail(String email, String password) async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(
        email: email,
        password: password,
      );
      return result.user;
    } catch (e) {
      print("注册失败: $e");
      return null;
    }
  }

  // 退出登录
  Future<void> signOut() async {
    await _auth.signOut();
  }
}

8. 验证部署

测试要点:

  1. 所有平台使用同一邮箱登录,检查 Firebase 控制台是否显示相同 UID
  2. 验证登录状态在各平台间保持同步
  3. 测试网络断开后的本地持久化登录状态

常见问题解决:

  • Web 登录失败:检查 Firebase 控制台已添加授权域
  • iOS 重定向失败:确认 URL Scheme 配置正确
  • Android SHA 指纹错误:在 Firebase 控制台添加调试/发布 SHA1

通过此方案,用户可在 iOS/Android/Web 使用同一账号体系登录,Firebase Auth 自动处理平台差异,实现真正的跨端统一认证。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐