Flutter身份验证插件firebase_auth_dart的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter身份验证插件firebase_auth_dart的使用

Firebase Auth for Dart 是一个纯 Dart 实现的身份验证库,用于帮助用户通过多种方法和提供商进行身份验证。此包用于 Firebase Auth Desktop 插件。

开始使用

首先,请确保您已经初始化了 Dart 中的 Firebase。如果您的目标是为 Flutter 应用程序使用 Firebase,请使用 firebase_auth 包以支持 iOS、Android、macOS 和 Web,并添加 firebase_auth_desktop 包以支持 Linux 和 Windows。

  1. 在项目的根目录下运行以下命令:

    dart pub add firebase_auth_dart
    
  2. 导入该包:

    import 'package:firebase_auth_dart/firebase_auth_dart.dart';
    

使用示例

初始化

调用 API 入口点来初始化包:

FirebaseAuth auth = FirebaseAuth.instance;

如果您想使用第二个 Firebase 应用,可以使用 instanceFor 方法:

FirebaseApp secondaryApp = Firebase.app('SecondaryApp');
FirebaseAuth auth = FirebaseAuth.instanceFor(app: secondaryApp);

监听认证状态变化

您可以监听认证状态的变化,通过以下流:

  1. authStateChanges():当用户的认证状态发生变化时触发事件(如登录和登出)。

    FirebaseAuth.instance
      .authStateChanges()
      .listen((User? user) {
        if (user == null) {
          print('用户已登出!');
        } else {
          print('用户已登录!');
        }
      });
    
  2. idTokenChanges():除了监听用户的认证状态变化外,还会在当前用户的令牌发生变化时触发事件。

    FirebaseAuth.instance
      .idTokenChanges()
      .listen((User? user) {
        if (user == null) {
          print('用户已登出!');
        } else {
          print('用户已登录!');
        }
      });
    

登录方法

匿名登录

要匿名登录用户,调用 signInAnonymously() 方法:

UserCredential userCredential = await FirebaseAuth.instance.signInAnonymously();

邮箱/密码注册与登录

  1. 注册:

    try {
      UserCredential userCredential = await FirebaseAuth.instance.createUserWithEmailAndPassword(
        email: "barry.allen@example.com",
        password: "SuperSecretPassword!"
      );
    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        print('提供的密码太弱。');
      } else if (e.code == 'email-already-in-use') {
        print('该邮箱已存在账户。');
      }
    } catch (e) {
      print(e);
    }
    
  2. 登录:

    try {
      UserCredential userCredential = await FirebaseAuth.instance.signInWithEmailAndPassword(
        email: "barry.allen@example.com",
        password: "SuperSecretPassword!"
      );
    } on FirebaseAuthException catch (e) {
      if (e.code == 'weak-password') {
        print('提供的密码太弱。');
      } else if (e.code == 'email-already-in-use') {
        print('该邮箱已存在账户。');
      }
    } catch (e) {
      print(e);
    }
    

OAuth 提供商

该包支持通过 signInWithCredential() 方法使用 Google 等 OAuth 提供商进行登录。此方法需要一个 AuthCredential 对象,该对象需要提供 providerIdsignInMethod

手机号码认证

要通过手机号码进行认证,需要在 Firebase 控制台中启用手机号码作为登录提供者。启用后,通过调用 signInWithPhoneNumber 方法启动认证流程:

// 等待用户完成 reCAPTCHA 并发送短信验证码。
ConfirmationResult confirmationResult = await FirebaseAuth.instance.signInWithPhoneNumber('+44 7123 123 456');

// 此方法会打开默认浏览器进行 reCAPTCHA 验证。完成后,可以使用收到的短信验证码确认用户登录。
UserCredential userCredential = await confirmationResult.confirm('123456');

登出

要登出用户,调用 signOut() 方法:

await FirebaseAuth.instance.signOut();

如果您正在监听认证状态的变化,将会收到一个新的事件。

用户管理

一旦用户认证成功,可以通过 User 类访问用户信息。User 类存储了用户的唯一标识符、关联的提供者账户等信息。您可以通过以下几种方式访问用户信息:

  1. 通过 currentUser 属性:

    var currentUser = FirebaseAuth.instance.currentUser;
    
    if (currentUser != null) {
      print(currentUser.uid);
    }
    
  2. 通过登录方法:

    UserCredential userCredential = await FirebaseAuth.instance.signInAnonymously();
    
    print(userCredential.user!.uid);
    
  3. 通过状态监听流:

    FirebaseAuth.instance
      .authStateChanges()
      .listen((User? user) {
        if (user != null) {
          print(user.uid);
        }
      });
    

删除用户

如果用户希望从项目中删除其账户,可以使用 delete() 方法。由于这是一个安全敏感的操作,需要用户最近登录。您可以捕获错误来处理这种情况:

try {
  await FirebaseAuth.instance.currentUser!.delete();
} on FirebaseAuthException catch (e) {
  if (e.code == 'requires-recent-login') {
    print('用户必须重新登录才能执行此操作。');
  }
}

重新认证用户

一些操作(如删除用户、更新电子邮件地址或提供者)需要用户最近登录。而不是让用户登出再登录,可以调用 reauthenticateWithCredential() 方法。如果需要最近登录,创建新的 AuthCredential 并传递给方法。例如,使用邮箱和密码重新认证:

// 提示用户输入其邮箱和密码
String email = 'barry.allen@example.com';
String password = 'SuperSecretPassword!';

// 创建凭证
AuthCredential credential = EmailAuthProvider.credential(email: email, password: password);

// 重新认证
await FirebaseAuth.instance.currentUser!.reauthenticateWithCredential(credential);

使用模拟器

如果您正在使用本地身份验证模拟器,则可以使用 useAuthEmulator 方法连接到此模拟器。确保传递正确的端口号。确保您的应用程序已启用对模拟器的网络连接。

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // 最佳时间初始化
  await FirebaseAuth.instance.useAuthEmulator('localhost', 9099);
  //...
}

更多关于Flutter身份验证插件firebase_auth_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter身份验证插件firebase_auth_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用firebase_auth_dart插件进行身份验证的代码示例。这个插件允许你使用Firebase Authentication服务来管理用户的登录和注册。

首先,确保你已经在你的Flutter项目中添加了firebase_auth_dart依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_auth_dart: ^0.x.x  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来,你需要在Firebase控制台中为你的应用配置Firebase Authentication。这包括设置电子邮件/密码提供商,以及可能的其他提供商(如Google、Facebook等)。确保你已经下载了google-services.json(对于Android)和GoogleService-Info.plist(对于iOS),并将它们放置在相应的项目目录中。

以下是一个简单的Flutter应用示例,展示了如何使用firebase_auth_dart插件进行用户注册和登录:

import 'package:flutter/material.dart';
import 'package:firebase_auth_dart/firebase_auth_dart.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Firebase Auth Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AuthScreen(),
    );
  }
}

class AuthScreen extends StatefulWidget {
  @override
  _AuthScreenState createState() => _AuthScreenState();
}

class _AuthScreenState extends State<AuthScreen> {
  final FirebaseAuth _auth = FirebaseAuth.instance;
  String _email = '';
  String _password = '';
  String _errorMessage = '';

  void _registerUser() async {
    setState(() {
      _errorMessage = '';
    });
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(
        email: _email,
        password: _password,
      );
      User? user = result.user;
      // 在这里处理用户注册成功后的逻辑,比如导航到另一个屏幕
      print("User registered: ${user?.uid}");
    } catch (e) {
      setState(() {
        _errorMessage = e.message ?? 'Registration Failed';
      });
    }
  }

  void _loginUser() async {
    setState(() {
      _errorMessage = '';
    });
    try {
      UserCredential result = await _auth.signInWithEmailAndPassword(
        email: _email,
        password: _password,
      );
      User? user = result.user;
      // 在这里处理用户登录成功后的逻辑,比如导航到另一个屏幕
      print("User logged in: ${user?.uid}");
    } catch (e) {
      setState(() {
        _errorMessage = e.message ?? 'Login Failed';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Firebase Auth Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            TextField(
              keyboardType: TextInputType.emailAddress,
              decoration: InputDecoration(labelText: 'Email'),
              onChanged: (value) {
                _email = value;
              },
            ),
            TextField(
              obscureText: true,
              decoration: InputDecoration(labelText: 'Password'),
              onChanged: (value) {
                _password = value;
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _registerUser,
              child: Text('Register'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: _loginUser,
              child: Text('Login'),
            ),
            SizedBox(height: 20),
            Text(
              _errorMessage,
              style: TextStyle(color: Colors.red),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的用户界面,允许用户输入电子邮件和密码进行注册和登录。注册和登录功能分别通过_registerUser_loginUser方法实现,这些方法调用FirebaseAuth实例的相应方法来完成身份验证。

请注意,在实际应用中,你应该处理更多的错误情况,比如网络错误、用户输入验证等,并且可能需要使用状态管理库(如Provider、Riverpod或Bloc)来管理应用状态。此外,确保你的Firebase项目配置正确,并且你的应用具有适当的权限来访问Firebase服务。

回到顶部