Flutter身份验证插件flutter_auth_provider的使用

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

Flutter身份验证插件flutter_auth_provider的使用

flutter_auth_provider 是一个用于构建 Flutter 应用的身份验证管理器。它提供了简单且可扩展的方式来处理用户认证相关的逻辑。

开始使用

步骤

  1. 添加依赖: 将 flutter_auth_provider 添加到你的 pubspec.yaml 文件中。

    dependencies:
      flutter_auth_provider: ^x.y.z
      flutter_secure_storage: ^x.y.z
    
  2. 实现存储类: 实现 AuthStoreTokenStore 来处理用户数据和令牌的持久化。

  3. 将存储类连接到视图: 使用 Provider 将存储类连接到应用的视图。

概念

1. 存储类(Stores)

存储类允许你实现自定义的数据持久化层,用于处理认证相关的数据。

  • AuthStore:这是用户相关数据的存储。当你实现 AuthStore 时,你可以使用一个自定义的类型作为 User 的泛型。

  • TokenStore:实现如何存储和刷新令牌。

示例实现

import 'package:flutter_auth_provider/flutter_auth_provider.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

class User {
  String userName;
  String role;

  const User({required this.role, required this.userName});
}

const String userNameKey = 'userName';
const String roleKey = 'role';
const String tokenKey = 'token';
const String refreshTokenKey = 'refreshToken';

class SecureStore implements AuthStore<User>, TokenStore {
  static SecureStore _instance = const SecureStore._();
  final FlutterSecureStorage _storage = const FlutterSecureStorage();

  const SecureStore._();

  factory SecureStore() => _instance;

  [@override](/user/override)
  Future<void> delete() async {
    await _storage.delete(key: userNameKey);
    await _storage.delete(key: roleKey);
  }

  [@override](/user/override)
  Future<User?> retrieve() async {
    final userName = await _storage.read(key: userNameKey);
    final role = await _storage.read(key: roleKey);
    if (userName != null && role != null) {
      return User(userName: userName, role: role);
    }
    return null;
  }

  [@override](/user/override)
  Future<void> save(User user) async {
    await _storage.write(key: userNameKey, value: user.userName);
    await _storage.write(key: roleKey, value: user.role);
  }

  [@override](/user/override)
  Future<void> clear() async {
    await _storage.delete(key: tokenKey);
    await _storage.delete(key: refreshTokenKey);
  }

  [@override](/user/override)
  Future<String?> getRefreshToken() async {
    return _storage.read(key: refreshTokenKey);
  }

  [@override](/user/override)
  Future<String?> getToken() async {
    return _storage.read(key: tokenKey);
  }

  [@override](/user/override)
  Future<void> saveTokens({required String token, String? refreshToken}) async {
    await _storage.write(key: tokenKey, value: token);
    if (refreshToken != null) {
      await _storage.write(key: refreshTokenKey, value: refreshToken);
    }
  }
}

2. 监听器(Listeners)

有两个监听器可以执行与认证事件相关的代码。

  • LoginListener:当用户登录时调用。
  • LogoutListener:当用户注销时调用。

示例

class MyLoginListener extends LoginListener {
  [@override](/user/override)
  void onLoginSuccess(User user) {
    // 用户登录成功后的操作
  }

  [@override](/user/override)
  void onLoginFailure(AuthException exception) {
    // 用户登录失败后的操作
  }
}

完整示例

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_auth_provider/flutter_auth_provider.dart';
import 'package:flutter_auth_provider_example/auth/secure_store.dart';
import 'package:flutter_auth_provider_example/auth/type_def.dart';
import 'package:flutter_auth_provider_example/auth/user.dart';
import 'package:flutter_auth_provider_example/auth_app.dart';
import 'package:flutter_auth_provider_example/unauth_app.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(
    AuthProvider<User>(
      store: SecureStore(),
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    final bool isAuthenticated = context.watch<MyAuthManager>().isLoggedIn;
    if (isAuthenticated) {
      return const AuthenticatedApp();
    } else {
      return const UnAuthenticatedApp();
    }
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 flutter_auth_provider 插件进行身份验证的示例代码。这个插件通常用于处理各种身份验证服务,比如 Firebase Authentication、Google Sign-In、Apple Sign-In 等。

首先,确保你已经在 pubspec.yaml 文件中添加了 flutter_auth_provider 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_auth_provider: ^最新版本号  # 替换为实际的最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,我们将展示如何使用 flutter_auth_provider 进行基本的 Google Sign-In 身份验证。这只是一个示例,具体实现可能需要根据你使用的身份验证服务进行调整。

1. 配置 Google Sign-In

在你的 android/app/src/main/AndroidManifest.xml 文件中添加以下权限和配置:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <!-- 其他配置 -->

    <application
        <!-- 其他配置 -->

        <!-- 添加 Google Sign-In 配置 -->
        <meta-data
            android:name="com.google.android.gms.client.measurement.enabled"
            android:value="false" />
        <meta-data
            android:name="com.google.android.gms.auth.api.signin.REVISED_APP_CLIENT_ID"
            android:value="你的客户端ID.apps.googleusercontent.com" />
    </application>

    <!-- 添加互联网权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

2. 配置 iOS 项目(如果需要)

对于 iOS 项目,你需要通过 Xcode 配置 Google Sign-In。具体步骤可以参考 Google 的官方文档。

3. 使用 flutter_auth_provider 进行身份验证

在你的 Flutter 项目中,创建一个新的 Dart 文件(例如 auth_service.dart)来处理身份验证逻辑:

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

class AuthService {
  final FlutterAuthProvider _authProvider = FlutterAuthProvider();

  Future<void> signInWithGoogle() async {
    try {
      // 触发 Google Sign-In
      final result = await _authProvider.signInWithGoogle();
      
      // 处理结果
      if (result.isSuccessful) {
        // 用户成功登录
        print('User signed in with Google: ${result.user?.email}');
      } else {
        // 登录失败
        print('Google Sign-In failed: ${result.errorMessage}');
      }
    } catch (e) {
      // 捕获任何异常
      print('An error occurred: $e');
    }
  }

  Future<void> signOut() async {
    try {
      // 触发登出
      await _authProvider.signOut();
      print('User signed out');
    } catch (e) {
      // 捕获任何异常
      print('An error occurred while signing out: $e');
    }
  }
}

4. 在你的应用中使用 AuthService

在你的主应用文件(例如 main.dart)中使用 AuthService

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

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

class MyApp extends StatelessWidget {
  final AuthService _authService = AuthService();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Auth Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Auth Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () {
                  _authService.signInWithGoogle();
                },
                child: Text('Sign in with Google'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  _authService.signOut();
                },
                child: Text('Sign out'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何使用 flutter_auth_provider 插件进行 Google Sign-In 身份验证。你可以根据插件的文档和其他身份验证服务的需求,扩展和修改这个示例。注意,实际项目中还需要处理更多的错误情况、用户状态管理等。

回到顶部