Flutter认证授权插件y_auth的使用

Flutter认证授权插件y_auth的使用

Y Auth项目

一个用于处理身份验证的Flutter包。

如何创建此项目?

设置Flutter

export PATH="$PATH:./flutter/sdk/flutter/bin"

创建Flutter包

首先,运行以下Flutter命令:

flutter create --template=package y_auth

创建示例Android & iOS包

首先,在y_auth包文件夹中运行以下Flutter命令:

flutter create example --platforms=android,ios

接下来,将模块与示例应用程序关联起来。在example/pubspec.yaml中导入库:

dependencies:
  y_auth:
    path: ../

之后,在lib/y_auth.dart中导出你想要共享的类:

export 'presentation/widget/passwordless_widget.dart';

现在,你可以在示例应用程序中使用passwordless_widget.dart

运行示例应用程序

使用flutter命令运行示例应用程序:

flutter run

发布

首先,创建一个经过验证的发布者配置文件。

之后,更新以下文件:README.mdCHANGELOG.mdpubspec.yaml

如果你想向CHANGELOG.md添加提交/更改,可以使用以下格式:

git log --pretty="- %s (%h) <%an>"

使用dart命令发布包以进行首次发布或更新到新版本:

dart pub publish

参考:Dart官方文档

示例代码

/* Copyright © 2024 Yesferal Cueva. All rights reserved. */
import 'package:example/example_auth_environment.dart';
import 'package:flutter/material.dart';
import 'package:y_auth/domain/model/session_model.dart';
import 'package:y_auth/domain/model/token_model.dart';
import 'package:y_auth/framework/logger/y_log.dart';
import 'package:y_auth/y_auth.dart';

void main() {
  ExampleAuthEnvironment().init();

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 此小部件是你的应用的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // 这是你的应用的主题。
        //
        // 尝试这样做:运行你的应用(通过输入"flutter run")。你会看到
        // 应用有一个紫色工具栏。然后,不退出应用,
        // 尝试将colorScheme中的seedColor改为Colors.green
        // 并触发热重载(保存更改或在支持热重载的IDE中按"hot reload"按钮,或者在命令行中输入"r")。
        //
        // 注意,计数器并没有重置回零;应用的状态不会在重载时丢失。要重置状态,使用热重启。
        //
        // 这也适用于代码,而不仅仅是值:大多数代码更改都可以通过简单的热重载来测试。
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // 此小部件是你的应用的主页。它是有状态的,意味着
  // 它有一个包含影响其外观的字段的状态对象(定义在下面)。
  //
  // 这个类是状态的配置。它持有由父组件(在这个例子中是App小部件)提供的值(例如标题)
  // 并被构建方法使用。小部件子类中的字段总是标记为"final"。

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  SessionModel? _sessionModel = null;
  YAuthDi? yAuthDi;

  [@override](/user/override)
  void initState() {
    yAuthDi = YAuthDi(ExampleAuthEnvironment());
    _syncSession();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 这个方法会在每次setState被调用时重新运行,例如上面的_incrementCounter方法。
    //
    // Flutter框架已经优化了重新运行构建方法的速度,因此你可以简单地重建任何需要更新的东西,
    // 而不是单独改变小部件实例。
    return Scaffold(
      appBar: AppBar(
        // 尝试这样做:将颜色更改为特定颜色(例如Colors.amber),并触发热重载
        // 以查看AppBar的颜色变化,而其他颜色保持不变。
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        // 这里我们取自MyHomePage对象的值,该对象由App.build方法创建,
        // 并将其用作appbar标题。
        title: Text(widget.title),
      ),
      body: Center(
        // Center是一个布局小部件。它接受一个子元素,并将其放置在父元素的中间。
        child: Column(
          // Column也是一个布局小部件。它接受一个子元素列表,并垂直排列它们。
          // 默认情况下,它水平大小适应其子元素,并尝试与其父元素一样高。
          //
          // Column有各种属性可以控制其自身大小和子元素的位置。这里我们使用mainAxisAlignment来
          // 垂直居中子元素;主轴是垂直的,因为Columns是垂直的(交叉轴是水平的)。
          //
          // 尝试这样做:触发调试绘制(选择IDE中的"Toggle Debug Paint"操作,或在控制台中按"p"键),
          // 以查看每个小部件的线框。
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("Email: ${_sessionModel?.email ?? "-"}"),
            Text("Display Name: ${_sessionModel?.displayName ?? "-"}"),
            ElevatedButton(
              onPressed: () {
                _navigateToLoginScreen();
              },
              child: const Text('Passwordless Screen'),
            ),
            ElevatedButton(
              onPressed: () {
                yAuthDi
                    ?.getAccessTokenUseCase()
                    .execute(_getAccessTokenSuccess, _getAccessTokenError);
              },
              child: const Text('Get current or new Access token'),
            ),
            ElevatedButton(
              onPressed: () {
                yAuthDi
                    ?.getAccessTokenUseCase()
                    .execute(_getAccessTokenSuccess, _getAccessTokenError, forceNewToken: true);
              },
              child: const Text('Get always a new Access token'),
            ),
            ElevatedButton(
              onPressed: () {
                YAuthDi(ExampleAuthEnvironment()).getSignOutUseCase().execute();
                _syncSession();
              },
              child: const Text('Sign Out'),
            ),
          ],
        ),
      ),
    );
  }

  _getAccessTokenSuccess(ApiResponseModel? apiResponseModel) {
    if (apiResponseModel != null) {
      YLog.d("Access Token: ${apiResponseModel.expressToken?.accessToken}");
      YLog.d("Refresh Token: ${apiResponseModel.expressToken?.refreshToken}");
    } else {
      YLog.d("Token is null");
      _navigateToLoginScreen();
    }
  }

  _getAccessTokenError(String message) {
    YLog.d("Error Message: ${message}");
    _navigateToLoginScreen();
  }

  _navigateToLoginScreen() {
    Navigator.push(
      context,
      MaterialPageRoute(
          builder: (context) =>
              YAuthDi(ExampleAuthEnvironment())
                  .getRequestAuthCodeScreen("#3F35A5", "Y-Auth-ExampleApp", "com.yesferal.auth.example")),
    ).then((_) {
      _syncSession();
    });
  }

  _syncSession() async {
    SessionModel? sessionModel = await yAuthDi
        ?.getCurrentSessionUseCase()
        .execute();

    setState(() {
      _sessionModel = sessionModel;
    });
  }
}

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

1 回复

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


y_auth 是一个用于 Flutter 应用的身份验证和授权的插件。它可以帮助开发者轻松地集成用户登录、注册、权限管理等功能。以下是如何使用 y_auth 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 y_auth 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  y_auth: ^1.0.0  # 请使用最新版本

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

2. 初始化 y_auth

在你的 Flutter 应用启动时,你需要初始化 y_auth 插件。通常,你可以在 main.dart 文件中进行初始化。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 y_auth
  await YAuth.initialize(
    apiKey: 'YOUR_API_KEY',
    authDomain: 'YOUR_AUTH_DOMAIN',
    projectId: 'YOUR_PROJECT_ID',
  );

  runApp(MyApp());
}

3. 用户注册

你可以使用 y_auth 插件来注册新用户。

void registerUser() async {
  try {
    User user = await YAuth.instance.register(
      email: 'user@example.com',
      password: 'password123',
    );
    print('User registered: ${user.uid}');
  } catch (e) {
    print('Registration failed: $e');
  }
}

4. 用户登录

用户登录可以通过以下方式实现:

void loginUser() async {
  try {
    User user = await YAuth.instance.login(
      email: 'user@example.com',
      password: 'password123',
    );
    print('User logged in: ${user.uid}');
  } catch (e) {
    print('Login failed: $e');
  }
}

5. 获取当前用户

你可以通过 YAuth.instance.currentUser 来获取当前登录的用户。

void getCurrentUser() {
  User? user = YAuth.instance.currentUser;
  if (user != null) {
    print('Current user: ${user.uid}');
  } else {
    print('No user is logged in');
  }
}

6. 用户登出

用户登出可以通过以下方式实现:

void logoutUser() async {
  await YAuth.instance.logout();
  print('User logged out');
}

7. 权限管理

y_auth 还提供了权限管理的功能。你可以通过以下方式检查用户的权限:

void checkPermission() async {
  bool hasPermission = await YAuth.instance.hasPermission('read:data');
  if (hasPermission) {
    print('User has permission');
  } else {
    print('User does not have permission');
  }
}

8. 监听认证状态

你可以通过 YAuth.instance.authStateChanges() 来监听用户的认证状态变化。

void listenAuthState() {
  YAuth.instance.authStateChanges().listen((User? user) {
    if (user != null) {
      print('User is logged in: ${user.uid}');
    } else {
      print('User is logged out');
    }
  });
}

9. 错误处理

在使用 y_auth 时,可能会遇到各种错误。你可以通过捕获异常来处理这些错误。

void handleErrors() async {
  try {
    User user = await YAuth.instance.login(
      email: 'user@example.com',
      password: 'wrongpassword',
    );
  } catch (e) {
    print('Error: $e');
  }
}
回到顶部