Flutter Azure AD 登录界面插件azuread_login_view的使用

Flutter Azure AD 登录界面插件azuread_login_view的使用

pub package Publish

flutter组件使用webview_flutterhttp库,提供处理通过Azure Active Directory进行OAuth登录的一个或多个组件。

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

void main() {
  runApp(const MyLoginExamplePage());
}

class MyLoginExamplePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final AzureADLoginViewOptions loginViewOptions = AzureADLoginViewOptionsBuilder()
      // 设置必需的配置
      .setTenant("<TENANT-NAME-OR-ID>")
      .setClientId("<CLIENT-ID>")
      .setRedirectUri("<REDIRECT-URI>")
      .setLoginPolicy("<NAME-OF-LOGIN-POLICY>")
      .setOnNewTokens((AzureADLoginNewTokensHandlerContext context) {
         // 可以在这里处理新的令牌
       })

      // 这是可选的
      .setOnNavigationError((AzureADLoginNavigationErrorHandlerContext context) {
         // 处理导航错误
       })

      .build();

    return MaterialApp(
      home: AzureADLoginView(loginViewOptions),
    );
  }
}

一个完整的示例应用可以在示例文件夹中找到。

完整示例代码

// This file is part of the azuread_login_view distribution.
// Copyright (c) Next.e.GO Mobile SE, Aachen, Germany (https://e-go-mobile.com/)
//
// azuread_login_view is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation, version 3.
//
// azuread_login_view is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

import 'dart:convert';

import 'package:azuread_login_view/azuread_login_view.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;

void main() {
  runApp(const AzureADLoginViewExampleApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(),
      home: const AzureADLoginViewExampleAppPage(),
    );
  }
}

class AzureADLoginViewExampleAppPage extends StatefulWidget {
  const AzureADLoginViewExampleAppPage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<AzureADLoginViewExampleAppPage> createState() => 
      _AzureADLoginViewExampleAppPageState();
}

class _AzureADLoginViewExampleAppPageState
    extends State<AzureADLoginViewExampleAppPage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        body: FutureBuilder(
      future: _loadAppJSON(),
      builder: (ctx, snapshot) {
        if (snapshot.hasError) {
          return Center(
            child: Text("${snapshot.error}"),
          );
        } else if (snapshot.hasData) {
          final dynamic appJSON = snapshot.data;

          return AzureADLoginView(AzureADLoginViewOptionsBuilder()
              .setTenant(appJSON['tenant'])
              .setClientId(appJSON['clientId'])
              .setRedirectUri(appJSON['redirectUri'])
              .setLoginPolicy(appJSON['loginPolicy'])
              .setScopes(appJSON['scopes'].map<String>((e) => "$e"))
              .setOnNewTokens((context) {
            // 打印新的令牌信息
            print('New tokens: ${context.tokens!.toMap()}');
          }).build());
        }

        return const Center(
          child: CircularProgressIndicator(),
        );
      },
    ));
  }

  Future<dynamic> _loadAppJSON() async {
    return jsonDecode(await rootBundle.loadString('assets/app.json'));
  }
}

更多关于Flutter Azure AD 登录界面插件azuread_login_view的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Azure AD 登录界面插件azuread_login_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 azuread_login_view 插件在 Flutter 应用中实现 Azure AD 登录界面的示例代码。这个示例假设你已经有一个配置好的 Azure AD 应用,并且已经获取了相关的客户端 ID 和租户 ID。

首先,你需要在你的 pubspec.yaml 文件中添加 azuread_login_view 依赖:

dependencies:
  flutter:
    sdk: flutter
  azuread_login_view: ^latest_version  # 请替换为最新版本号

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

接下来,在你的 Flutter 应用中实现 Azure AD 登录界面。以下是一个简单的示例:

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

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

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

class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  final String clientId = 'your-client-id';  // 替换为你的 Azure AD 应用的客户端 ID
  final String tenantId = 'your-tenant-id';  // 替换为你的 Azure AD 租户 ID
  final String redirectUri = 'your-redirect-uri';  // 替换为你的重定向 URI

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Azure AD Login'),
      ),
      body: Center(
        child: AzureADLoginView(
          clientId: clientId,
          tenantId: tenantId,
          redirectUri: redirectUri,
          onLoginSuccess: (userInfo) {
            // 登录成功后回调,userInfo 包含用户信息
            print('Login successful: $userInfo');
            // 你可以在这里处理登录成功后的逻辑,比如导航到另一个页面
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => HomeScreen(userInfo: userInfo)),
            );
          },
          onLoginFailure: (error) {
            // 登录失败回调
            print('Login failed: $error');
            // 你可以在这里处理登录失败后的逻辑,比如显示错误消息
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('Login failed: $error')),
            );
          },
        ),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  final Map<String, dynamic> userInfo;

  HomeScreen({required this.userInfo});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Welcome, ${userInfo['name']}!'),
            // 你可以在这里显示更多用户信息
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们定义了一个 LoginScreen 小部件,它包含一个 AzureADLoginView 小部件。
  2. AzureADLoginView 小部件接受 clientIdtenantIdredirectUri 作为参数,这些都是从 Azure AD 应用配置中获取的。
  3. onLoginSuccessonLoginFailure 回调分别处理登录成功和登录失败的情况。
  4. 登录成功后,我们导航到一个新的 HomeScreen 页面,并传递用户信息。

请确保将 your-client-idyour-tenant-idyour-redirect-uri 替换为你自己的 Azure AD 应用的实际值。

这个示例提供了一个基本的框架,你可以根据自己的需求进一步定制和扩展。

回到顶部