Flutter认证管理插件auth_manager的使用

认证管理器 🔒 #

此包由Unwired库用于管理认证过程。您可以扩展AuthManager类来自定义自己的认证管理器。

管理内容 #

  1. 认证对象 - 在授权头中使用的令牌或凭据
  2. 用户数据 - 当前登录用户的姓名、电子邮件等信息

函数 #

  • ✅ authenticate - 将令牌和用户数据保存到存储中
  • ✅ unauthenticate - 从存储中移除令牌和用户数据
  • ✅ get isAuthenticated - 如果用户已认证则返回true
  • ✅ get authObject - 如果存在,则返回认证对象
  • ✅ get authStateChanges - 返回认证状态更改的流
  • ✅ get userData - 如果存在,则返回用户数据
  • ✅ get parsedAuthObject - 返回要嵌入到授权头中的字符串

使用 #

AuthManager 可以与 Unwired 库一起使用来管理认证过程。您也可以将其作为独立的包来管理应用程序中的认证。

class TokenAuthManager extends NoUserAuthManager<String> {
  TokenAuthManager({required this.secureStorage}) {
    secureStorage.read(key: _key).then((value) {
      _token = value;
      _completer.complete(_token != null);
    });
  }

  final FlutterSecureStorage secureStorage;

  final Completer<bool> _completer = Completer<bool>();

  [@override](/user/override)
  Future synchronize() async {
    final authState = await _completer.future;
    _sink.add(authState);
    return;
  }

  String _key = 'random_key';

  String? _token;

  [@override](/user/override)
  String? get authObject => _token;
  
  final StreamController<bool> _controller = StreamController<bool>.broadcast();
  StreamSink get _sink => _controller.sink;
  
  [@override](/user/override)
  Stream<(bool, void)> get authStateChanges => _controller.stream;

  Future authenticate({required String authObject, void userData}) async {
    await secureStorage.write(key: _key, value: token);
    _token = token;
    _sink.add(true);
  }

  Future unauthenticate() async {
    await secureStorage.delete(key: _key);
    _token = null;
    _sink.add(false);
  }

  [@override](/user/override)
  bool get isAuthenticated => _token != null;

  String Function(String? token) _tokenParser =
      (token) => token != null ? 'Bearer $token' : '';

  /// 此函数用于解析 [authObject] 以包含任何关键字
  /// 例如 'Bearer ' 以及在请求的 `Authorization` 头中的 [String] 令牌,
  /// 具体取决于令牌类型。
  set tokenParser(String Function(String? token) parser) {
    _tokenParser = parser;
  }

  [@override](/user/override)
  String get parsedAuthObject => _tokenParser(_token);
}

完整的示例 #

以下是一个完整的示例,展示了如何使用TokenAuthManager进行认证管理。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:auth_manager/auth_manager.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

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

class MyApp extends StatelessWidget {
  final TokenAuthManager _authManager = TokenAuthManager(secureStorage: FlutterSecureStorage());

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('认证管理器示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () async {
                  // 认证
                  await _authManager.authenticate(authObject: 'your_token_here');
                  print('用户已认证');
                },
                child: Text('认证'),
              ),
              ElevatedButton(
                onPressed: () async {
                  // 取消认证
                  await _authManager.unauthenticate();
                  print('用户已取消认证');
                },
                child: Text('取消认证'),
              ),
              ElevatedButton(
                onPressed: () {
                  // 检查是否已认证
                  bool isAuthenticated = _authManager.isAuthenticated;
                  print('用户已认证: $isAuthenticated');
                },
                child: Text('检查认证状态'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter认证管理插件auth_manager的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是如何在Flutter项目中使用auth_manager插件来进行认证管理的一个基本示例。请注意,auth_manager并不是一个广泛认知的标准Flutter插件,因此我将基于一个假设的插件接口来编写代码。如果你使用的是特定的第三方插件,请参考该插件的官方文档进行调整。

假设auth_manager插件提供了基本的用户注册、登录和注销功能,以下是如何在Flutter应用中使用这些功能的示例代码。

1. 添加依赖

首先,在pubspec.yaml文件中添加auth_manager依赖(如果它是一个pub.dev上的包):

dependencies:
  flutter:
    sdk: flutter
  auth_manager: ^x.y.z  # 替换为实际的版本号

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

2. 导入插件

在你的Dart文件中导入auth_manager

import 'package:auth_manager/auth_manager.dart';

3. 使用插件

以下是一个简单的示例,展示了如何使用auth_manager插件进行用户注册、登录和注销。

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

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

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

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

class _AuthScreenState extends State<AuthScreen> {
  final AuthManager _authManager = AuthManager();
  bool _isLoggedIn = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Auth Manager Demo'),
      ),
      body: Center(
        child: _isLoggedIn
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('You are logged in!'),
                  ElevatedButton(
                    onPressed: () async {
                      await _authManager.logout();
                      setState(() {
                        _isLoggedIn = false;
                      });
                    },
                    child: Text('Logout'),
                  ),
                ],
              )
            : Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('Please log in'),
                  ElevatedButton(
                    onPressed: () async {
                      // 假设登录方法需要用户名和密码
                      bool success = await _authManager.login(
                        username: 'example_user',
                        password: 'example_password',
                      );
                      if (success) {
                        setState(() {
                          _isLoggedIn = true;
                        });
                      } else {
                        ScaffoldMessenger.of(context).showSnackBar(
                          SnackBar(content: Text('Login failed')),
                        );
                      }
                    },
                    child: Text('Login'),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      // 假设注册方法需要用户名和密码
                      bool success = await _authManager.register(
                        username: 'new_user',
                        password: 'new_password',
                      );
                      if (success) {
                        ScaffoldMessenger.of(context).showSnackBar(
                          SnackBar(content: Text('Registration successful')),
                        );
                      } else {
                        ScaffoldMessenger.of(context).showSnackBar(
                          SnackBar(content: Text('Registration failed')),
                        );
                      }
                    },
                    child: Text('Register'),
                  ),
                ],
              ),
      ),
    );
  }
}

注意事项

  1. 实际插件接口:上面的代码是基于假设的插件接口编写的。实际使用时,请查阅auth_manager插件的官方文档,了解具体的API和方法。

  2. 错误处理:在实际应用中,应该添加更多的错误处理逻辑,比如网络错误、认证失败等。

  3. 安全性:不要在客户端存储敏感信息,如明文密码。使用安全的方式处理用户认证,如OAuth、Firebase Authentication等。

  4. UI/UX:上面的UI示例非常基础,实际应用中应该设计更友好的用户界面和用户体验。

希望这个示例能帮助你理解如何在Flutter项目中使用认证管理插件。如果你使用的是特定的第三方插件,请参考该插件的官方文档进行具体实现。

回到顶部