Flutter高级平台认证插件senior_platform_authentication的使用

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

Flutter高级平台认证插件senior_platform_authentication的使用

本项目旨在成为连接用于与Senior-X进行身份验证的端点和Dart语言的桥梁,而无需直接依赖于Flutter SDK。因此,它不仅可用于Flutter应用程序,还可以与其他使用Dart的语言的应用程序一起使用。

我们还提供了senior_platform_authentication_ui包,该包已经集成了此项目,并提供了可供Flutter应用程序使用的现成界面和与Senior-X相关的业务规则。

建议仅在开发项目需要对Flutter前端界面进行自定义,而senior_platform_authentication_ui库不支持的情况下,直接使用此包。

架构

架构基于清洁架构(Clean Architecture),但在项目范围分析后进行了某些适应性调整。该项目仅提供数据层和领域层,以便独立使用。

如何使用

加载senior_platform_authentication包:

import 'package:senior_platform_authentication/senior_platform_authentication.dart';

配置基础URL(可选)

远程数据源被配置为使用包含请求基础URL的单例。默认情况下,使用的是Senior X生产环境的基础URL。

SeniorAuthentication.initialize(
  encryptionKey: '您的32个字符的加密密钥',
);

也可以初始化选择请求将被定向到的环境:

SeniorAuthentication.initialize(
  platformEnvironment: PlatformEnvironment.homolog,
  encryptionKey: '您的32个字符的加密密钥',
);

此外,initialize方法还有其他可用的配置选项,详情如下:

参数名 默认值 描述
platformEnvironment PlatformEnvironment.production 请求将被定向到的环境。
enableLoginOffline false 启用或禁用离线登录。仅在与senior-platform-authentication-ui包一起使用时有效。
automaticLogon true 定义是否应自动登录。仅在与senior-platform-authentication-ui包一起使用且enableLoginOffline已启用时有效。
includePhoto false 启用或禁用在调用getUser时包含用户照片。
baseUrl ‘’ platformEnvironment具有值PlatformEnvironment.custom时使用。定义自定义的基础URL。
baseAnonymousUrl ‘’ platformEnvironment具有值PlatformEnvironment.custom时使用。定义自定义的匿名基础URL。
frontendUrl ‘’ platformEnvironment具有值PlatformEnvironment.custom时使用。定义自定义的前端URL。
enableLoginWithKey false 启用或禁用应用密钥登录。仅在与senior-platform-authentication-ui包一起使用时有效。
encryptionKey N/A 包含32个字符的加密密钥,将在存储和读取敏感数据时使用。

注意: encryptionKey参数始终应该是相同的,否则将无法解密数据。

调用一个用例

用例可以按照以下方式调用:

final credentials = UserLogin(
  username: '{YOUR_USERNAME}',
  password: '{YOUR_PASSWORD}',
  scope: 'mobile',
);

final loginUsecase = LoginUsecase();
await loginUsecase(credentials);

或者,我们可以直接调用call方法:

await loginUsecase.call(credentials);

注意事项

建议仅使用已经实现的用例及其与Senior X相关的业务规则。如果需要任何自定义,请联系Senior Sistemas的集成联系人。


示例代码

example/main.dart

import 'package:senior_platform_authentication/senior_platform_authentication.dart';

void main() async {
  final getConnectionStatus = GetConnectivityStatusUsecase();
  final connStatus = await getConnectionStatus(NoParams());

  print('是否连接: $connStatus.');

  final credentials = UserLogin(
    username: '{YOUR_USERNAME}',
    password: '{YOUR_PASSWORD}',
    scope: 'mobile',
  );

  final tenantLogin = TenantLogin(
    userName: '{YOUR_USERNAME}',
    tenantDomain: '{YOUR_TENANT}',
  );

  SeniorAuthentication.initialize(
    platformEnvironment: PlatformEnvironment.production,
    encryptionKey: SeniorAuthentication.encryptionKey,
  );

  final getRecaptchaUrlUsecase = GetRecaptchaUrlUsecase();
  final loginUsecase = LoginUsecase();
  final getUserUsecase = GetUserUsecase();
  final logoutOnlineUsecase = LogoutUsecase();
  final getTenantLoginSettingsUsecase = GetTenantLoginSettingsUsecase();
  final refreshTokenUsecase = RefreshTokenUsecase();
  final getTenantSettingsUsecase = GetTenantSettingsUsecase();

  try {
    final url = await getRecaptchaUrlUsecase(NoParams());
    print('RECAPTCHA URL >>> $url');

    final authenticationResponse = await loginUsecase(credentials);
    print('AUTHENTICATION RESPONSE >>> ${authenticationResponse.toString()}');

    final tenantSettings = await getTenantSettingsUsecase(
        authenticationResponse.token?.accessToken ?? '');
    print('TENANT SETTINGS >>> ${tenantSettings.toString()}');

    final getUserInput = GetUserInput(
      accessToken: authenticationResponse.token?.accessToken ?? '',
      username: authenticationResponse.token?.username ?? '',
      includePhoto: false,
    );

    final user = await getUserUsecase(getUserInput);
    print('USER >>> ${user.toString()}');

    final refreshToken = RefreshToken(
        token: authenticationResponse.token?.refreshToken ?? '',
        scope: authenticationResponse.token?.accessToken ?? '',
        tenant: user.tenantName);

    final refreshAuthenticationResponse =
        await refreshTokenUsecase(refreshToken);

    print('REFRESH AUTHENTICATION RESPONSE >>> $refreshAuthenticationResponse');

    // Call method is optional when calling usecase to be executed.
    final logout = await logoutOnlineUsecase
        .call(refreshAuthenticationResponse.token?.accessToken ?? '');
    print('LOGOUT >>> $logout');

    final tenantLoginSettings =
        await getTenantLoginSettingsUsecase.call(tenantLogin);
    print('TENANT LOGIN SETTINGS >>> $tenantLoginSettings');
  } on ServerException catch (e) {
    print('服务器异常 >>> ${e.toString()}');
  } on UnauthorizedException catch (e) {
    print('未授权异常 >>> ${e.toString()}');
  } on BadRequestException catch (e) {
    print('错误请求异常 >>> ${e.toString()}');
  } on TenantNotFoundException catch (e) {
    print('租户未找到异常 >>> ${e.toString()}');
  } on UnknownException catch (e) {
    print('未知异常 >>> ${e.toString()}');
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter的senior_platform_authentication插件进行高级平台认证的代码示例。这个插件假设是一个虚构的插件,用于展示如何在Flutter应用中集成平台特定的认证机制。请注意,实际插件的API可能会有所不同,因此以下代码仅为示例用途。

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

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

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

接下来,在你的Flutter应用中,你可以按照以下方式使用senior_platform_authentication插件:

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

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

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

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

class _AuthScreenState extends State<AuthScreen> {
  final SeniorPlatformAuthentication _auth = SeniorPlatformAuthentication();
  String _authResult = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Senior Platform Authentication'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Authentication Result:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 16),
            Text(
              _authResult,
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 32),
            ElevatedButton(
              onPressed: _performPlatformAuthentication,
              child: Text('Authenticate'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _performPlatformAuthentication() async {
    try {
      // 调用插件的认证方法
      String result = await _auth.authenticate();
      
      // 更新UI以显示认证结果
      setState(() {
        _authResult = result;
      });
    } catch (e) {
      // 处理认证失败的情况
      setState(() {
        _authResult = 'Authentication failed: ${e.message}';
      });
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,用于触发平台特定的认证流程。SeniorPlatformAuthentication类(假设这是插件提供的类)有一个authenticate方法,该方法返回一个Future,表示认证结果。

请注意以下几点:

  1. 插件的API:实际的插件API可能与上述示例中的不同。你需要查阅插件的官方文档来了解其具体的API和用法。
  2. 错误处理:在实际应用中,你应该添加更详细的错误处理逻辑,以处理各种可能的异常情况。
  3. UI更新:使用setState方法来更新UI,以反映认证结果。

由于senior_platform_authentication是一个虚构的插件,因此上述代码仅为示例。在实际应用中,你需要根据所使用插件的实际API进行调整。

回到顶部