Flutter Azure静默认证插件azure_silent_auth的使用

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

Flutter Azure静默认证插件 azure_silent_auth 的使用

azure_silent_auth 是一个用于无缝集成 Azure 认证和静默登录的 Flutter 插件。它提供了多种功能,包括认证、安全存储、自动令牌管理等。

主要功能

  • Azure Authentication: 包括登录、登出和静默登录。
  • Secure Storage: 安全地存储和管理令牌及用户数据。
  • Silent Login: 提供静默登录功能,节省开发者时间。
  • 适用于离线应用: 静默登录特别适合那些需要在没有网络连接的情况下进行用户认证的应用。
  • Token Management: 自动处理令牌过期和刷新。

使用方法

初始化 AzureAuth 实例

首先,导入必要的包并初始化 AzureAuth 实例:

import 'package:azure_silent_auth/authenticator/default_authenticator.dart';
import 'package:azure_silent_auth/azure_silent_auth.dart';

AzureAuth _azureAuth = AzureAuth(
  authenticatorProvider: DefaultAuthenticator(
    'https://login.microsoftonline.com/{tenant-id}/', // 替换为你的租户ID
    ["openId", "offline_access"], // 范围
    '{client-id}', // 替换为你的客户端ID
    '&prompt=select_account', // 登录提示
    {nnnn}, // 重定向URI端口 (例如:http://localhost:nnnn/)
  ),
);

第一次登录

当用户首次打开应用程序时,调用 await _azureAuth.login(); 打开认证页面。成功登录后,令牌将被安全存储。

获取访问令牌

当应用程序需要访问令牌时,调用 await _azureAuth.getAccessToken();。如果令牌已过期,它将自动刷新。

获取用户信息

当应用程序需要获取当前登录用户的信息时,调用 _azureAuth.getUserInfo();

静默登录

当应用程序重新打开时,使用 await _azureAuth.silentLogin(); 进行静默登录。后台验证存储的令牌是否有效,无需重定向到认证页面。如果令牌无效或过期,则会抛出错误,允许开发者将用户重定向到登录屏幕。

注销

调用 _azureAuth.logout(); 清除所有本地存储的令牌和用户数据,并向 OpenID 提供者发送注销请求。

示例代码

以下是一个完整的示例应用程序,展示了如何在不同场景下使用 azure_silent_auth

import 'package:azure_silent_auth/authenticator/default_authenticator.dart';
import 'package:azure_silent_auth/model.dart';
import 'package:azure_silent_auth/azure_silent_auth.dart';
import 'package:flutter/material.dart';
import 'package:azure_silent_auth/storage/default_storage.dart';

class AuthenticationHandler {
  static final AuthenticationHandler _instance =
      AuthenticationHandler._internal();

  factory AuthenticationHandler() {
    return _instance;
  }

  AuthenticationHandler._internal();

  final AzureAuth _azureAuth = AzureAuth(
    authenticatorProvider: DefaultAuthenticator(
      'https://login.microsoftonline.com/90440eb1-5d83-4e46-82b7-430409c54b9e/', // 替换为你的租户ID
      ["openId", "offline_access"],
      'd4e38243-f46f-44b8-9916-b00299661b71', // 替换为你的客户端ID
      '&prompt=select_account',
      3000, // 重定向URI端口
    ),
  );

  Future<void> login() async {
    await _azureAuth.login();
  }

  Future<void> silentLogin() async {
    await _azureAuth.silentLogin();
  }

  Future<void> logout() async {
    await _azureAuth.logout();
  }

  Future<String?> getUserName() async {
    return await _azureAuth.getUserInfo().then((value) => value?.name);
  }

  Future<User?> getAllInfo() async {
    return await _azureAuth.getUserInfo();
  }
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  DefaultStorage storage = DefaultStorage();
  final value = await storage.isTokenSavedLocally();

  runApp(MyApp(isTokenAvailable: value));
}

class MyApp extends StatelessWidget {
  final bool isTokenAvailable;

  const MyApp({Key? key, required this.isTokenAvailable}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: isTokenAvailable
          ? const HomeScreen(silentLogin: true)
          : const LoginScreen(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            await AuthenticationHandler().login();

            if (context.mounted) {
              Navigator.pushReplacement(
                context,
                MaterialPageRoute(
                    builder: (context) => const HomeScreen(silentLogin: false)),
              );
            }
          },
          child: const Text('Login'),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用azure_silent_auth插件进行Azure静默认证的代码示例。这个插件通常用于在无需用户交互的情况下刷新和获取访问令牌。

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

dependencies:
  flutter:
    sdk: flutter
  azure_silent_auth: ^最新版本号 # 请替换为当前最新版本号

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

配置Azure AD

在使用azure_silent_auth之前,你需要在Azure AD中配置你的应用,并获取客户端ID、重定向URI等信息。确保你的应用已在Azure门户中注册,并配置了相应的回复URL。

Flutter代码示例

以下是一个基本的Flutter应用示例,展示了如何使用azure_silent_auth插件进行静默认证:

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

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

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

class SilentAuthDemo extends StatefulWidget {
  @override
  _SilentAuthDemoState createState() => _SilentAuthDemoState();
}

class _SilentAuthDemoState extends State<SilentAuthDemo> {
  final AzureSilentAuth _azureSilentAuth = AzureSilentAuth();
  String _accessToken = '';

  @override
  void initState() {
    super.initState();
    _initializeAuth();
  }

  Future<void> _initializeAuth() async {
    // 配置Azure AD参数
    final String clientId = 'your-client-id'; // 替换为你的客户端ID
    final String tenantId = 'your-tenant-id'; // 替换为你的租户ID
    final String redirectUri = 'your-redirect-uri'; // 替换为你的重定向URI

    // 初始化AzureSilentAuth
    await _azureSilentAuth.init(
      clientId: clientId,
      tenantId: tenantId,
      redirectUri: redirectUri,
    );

    // 尝试进行静默认证
    final bool authenticated = await _azureSilentAuth.silentAuthenticate();
    if (authenticated) {
      final String? token = await _azureSilentAuth.getAccessToken();
      setState(() {
        _accessToken = token ?? '';
      });
    } else {
      // 如果静默认证失败,可能需要用户交互登录
      print('Silent authentication failed. User interaction may be required.');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Azure Silent Auth Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Access Token:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              _accessToken,
              style: TextStyle(fontSize: 18),
              maxLines: 5,
              overflow: TextOverflow.ellipsis,
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 处理Token过期:静默认证主要用于刷新令牌。如果令牌过期且无法刷新(例如,用户已撤销权限),你可能需要引导用户重新登录。
  2. 错误处理:在实际应用中,应添加更多的错误处理逻辑,以处理各种可能的认证失败情况。
  3. 安全性:确保你的应用遵循最佳安全实践,特别是在处理敏感信息(如访问令牌)时。

这个示例展示了基本的静默认证流程,但在实际生产环境中,你可能需要根据具体需求进行更多的配置和错误处理。

回到顶部