Flutter登录功能插件m_login_sdk的使用

Flutter登录功能插件 m_login_sdk 的使用

概述

m_login_sdk 是一个原生的 Flutter 客户端库,允许访问 M-Login 系统。M-Login 系统是一个面向慕尼黑城市区域企业和机构的身份提供商方案。用户可以通过该系统集中管理他们的数据,并以安全透明的方式允许其他系统访问这些数据。SDK 基于 OAuth2 标准构建,包括 PKCE 增强。

支持的功能

  • 登录
  • 注册
  • 用户数据管理(姓名、电子邮件、地址、生日、电话号码等)
  • 支付方式管理
  • 从支付结算流程中恢复错误

使用前准备

1. Flutter 项目

确保你有一个 Flutter 项目。

2. ClientID

你需要向 M-Login 团队申请一个 client-id。请访问 https://login.muenchen.de/ 获取联系详情。

3. Redirect URI

在获取 client-id 时,你应该已经定义了一个 redirectUri。这个 URI 应该以自定义的 URL scheme 开头(例如 de.example.my-app),以避免运行时错误和混淆。

集成 SDK

添加依赖

pubspec.yaml 文件中添加 m_login_sdk 依赖并运行 flutter pub get

dependencies:
  m_login_sdk: ^1.1.0

设置

Android 设置

  1. 设置最低 API 版本:确保 minSdkVersion 设置为 >= 24。

    打开 android/app/build.gradle 文件,找到 minSdkVersion 并设置为 24 或更高。

  2. 将主活动设置为 singleTask:打开 android/app/src/main/AndroidManifest.xml 文件,在 MainActivity 中添加 android:launchMode="singleTask"

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTask">
    </activity>
    
  3. 注册自定义 URL Scheme:在 AndroidManifest.xml 文件中,为主活动添加以下内容:

    <intent-filter android:label="m_login_sdk">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="YOUR_URL_SCHEME" />
    </intent-filter>
    

    YOUR_URL_SCHEME 替换为你的实际 URL scheme。

  4. 针对 API 30 及以上版本:如果你的目标是 Android 30 及以上版本,请在 AndroidManifest.xml 文件中添加以下内容:

    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
        </intent>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.APP_BROWSER" />
            <data android:scheme="https" />
        </intent>
    </queries>
    

iOS 设置

编辑 ios/Runner/Info.plist 文件并添加以下内容:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>YOUR_URL_SCHEME</string>
        </array>
    </dict>
</array>

YOUR_URL_SCHEME 替换为你的实际 URL scheme。

使用示例

示例代码

以下是一个简单的示例,展示了如何使用 m_login_sdk 进行登录:

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  String loginResultText = '<Not yet logged in>';

  final MLogin mLogin = MLogin(
    config: MLoginConfig.k,
    clientId: 'm-login-demo-app-k',
    callbackUrlScheme: 'k.de.swm.login.app',
    redirectUri: 'k.de.swm.login.app:/oauth2redirect/example',
  );

  Future<void> _startLogin() async {
    setState(() {
      loginResultText = 'Logging in...';
    });

    final loginResult = await mLogin.login(ephemeral: false);

    setState(() {
      loginResult.process(
        (authCode, verifier) {
          loginResultText =
              'Login successful!\ncode: $authCode\nverifier: $verifier';
        },
        (error) {
          loginResultText = 'Login FAILED!\n$error';
        },
      );
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _startLogin,
              child: const Text('Login'),
            ),
            Text(loginResultText),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用m_login_sdk插件来实现登录功能的示例代码。请注意,这个示例假设你已经有一个Flutter项目,并且已经配置好了基本的开发环境。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  m_login_sdk: ^最新版本号  # 请替换为实际的最新版本号

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

2. 导入插件

在你的登录页面(比如login_page.dart)中导入m_login_sdk

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

3. 配置和初始化

在应用的入口文件(通常是main.dart)中,你可以配置和初始化m_login_sdk。这里假设你需要配置一些必要的参数,如API密钥等(具体配置请参考插件的官方文档)。

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化m_login_sdk(示例代码,具体配置请参考官方文档)
  MLoginSDK.init(
    apiKey: '你的API密钥',
    // 其他配置参数...
  );
  runApp(MyApp());
}

4. 实现登录功能

在你的登录页面(login_page.dart)中,你可以使用m_login_sdk提供的API来实现登录功能。

class LoginPage extends StatefulWidget {
  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  final _formKey = GlobalKey<FormState>();
  String _username = '';
  String _password = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('登录'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: '用户名'),
                validator: (value) {
                  if (value.isEmpty) {
                    return '请输入用户名';
                  }
                  return null;
                },
                onChanged: (value) {
                  setState(() {
                    _username = value;
                  });
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: '密码'),
                obscureText: true,
                validator: (value) {
                  if (value.isEmpty) {
                    return '请输入密码';
                  }
                  return null;
                },
                onChanged: (value) {
                  setState(() {
                    _password = value;
                  });
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  if (_formKey.currentState!.validate()) {
                    try {
                      // 调用登录方法
                      var result = await MLoginSDK.login(
                        username: _username,
                        password: _password,
                      );
                      if (result.success) {
                        // 登录成功处理
                        ScaffoldMessenger.of(context).showSnackBar(
                          SnackBar(content: Text('登录成功')),
                        );
                        // 跳转到主页面或其他逻辑
                      } else {
                        // 登录失败处理
                        ScaffoldMessenger.of(context).showSnackBar(
                          SnackBar(content: Text('登录失败: ${result.message}')),
                        );
                      }
                    } catch (e) {
                      // 错误处理
                      ScaffoldMessenger.of(context).showSnackBar(
                        SnackBar(content: Text('发生错误: $e')),
                      );
                    }
                  }
                },
                child: Text('登录'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

5. 运行应用

确保你的项目配置正确,然后运行应用,你应该能够看到一个简单的登录页面,使用m_login_sdk插件提供的登录功能。

注意

  • 以上代码是基于假设m_login_sdk插件提供了initlogin方法。实际使用时,请参考插件的官方文档和API参考,因为不同插件的API可能有所不同。
  • 确保你已经正确配置了API密钥和其他必要的参数。
  • 处理用户输入和敏感信息时,请遵循最佳实践,确保应用的安全性。
回到顶部