Flutter阿联酋身份验证插件flutter_uae_pass的使用

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

Flutter阿联酋身份验证插件flutter_uae_pass的使用

概述

flutter_uae_pass 是一个非官方的Flutter插件,用于在Android和iOS平台上集成阿联酋身份验证(UAE Pass)。以下是该插件的使用指南。

Demo

开始使用

  1. 添加插件到 pubspec.yaml 文件

    flutter_uae_pass: ^0.0.1
    
  2. 运行 flutter pub get

    flutter pub get
    
  3. 导入包

    import 'package:flutter_uae_pass/uae_pass.dart';
    final _uaePassPlugin = UaePass();
    
  4. 初始化插件 - 沙盒环境

    await _uaePassPlugin.setUpSandbox(); // 使用沙盒环境
    
  5. 初始化插件 - 生产环境

    await _uaePassPlugin.setUpEnvironment(
      clientId: "<clientId>", // 替换为实际的客户端ID
      clientSecret: "<clientSecret>", // 替换为实际的客户端密钥
      urlScheme: "myappscheme", // 替换为应用的URL Scheme
      redirectUri: "<redirectUri>", // 替换为实际的重定向URI
      isProduction: true, // 设置为生产环境
    );
    

作用域说明

  • urn:uae:digitalid:profile:general
  • urn:uae:digitalid:profile

主要功能

  • signIn():用户登录
  • getAccessToken(String authCode):获取访问令牌
  • getProfile(String token):获取用户信息
  • signOut():退出登录

调用认证方法

String? authCode = await _uaePassPlugin.signIn(); // 调用登录方法

获取访问令牌

String? accessToken = await _uaePassPlugin.getAccessToken(authCode); // 使用授权码获取访问令牌

获取公共资料数据

你可以从资料中获取以下信息:

  • idn
  • email
  • firstnameAR
  • firstnameEN
  • fullnameEN
  • gender
  • lastnameAR
  • lastnameEN
  • mobile
  • nationalityAR
  • nationalityEN
  • sub
  • userType
  • uuid
ProfileData? profileData = await _uaePassPlugin.getProfile(accessToken); // 使用访问令牌获取用户信息

iOS设置

  1. Info.plist 文件中添加以下内容:

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>uaepass</string>
        <string>uaepassqa</string>
        <string>uaepassdev</string>
        <string>uaepassstg</string>
    </array>
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>CFBundleURLName</key>
            <string>myappscheme</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>myappscheme</string>
            </array>
        </dict>
    </array>
    

Android设置

  1. 更新 android:launchMode="singleTask"AndroidManifest.xml 文件中:

    <activity
        android:name=".MainActivity"
        android:exported="true"
        android:launchMode="singleTask"
        .....
    </activity>
    
  2. AndroidManifest.xml 文件中设置查询:

    <queries>
        <package android:name="ae.uaepass.mainapp" />
        <package android:name="ae.uaepass.mainapp.qa" />
        <package android:name="ae.uaepass.mainapp.stg" />
    </queries>
    
  3. AndroidManifest.xml 文件中设置意图过滤器:

    <intent-filter >
        <action android:name="android.intent.action.VIEW" />
    
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    
        <data
            android:host="success"
            android:scheme="myappscheme" />
    
        <data
            android:host="failure"
            android:scheme="myappscheme" />
    </intent-filter>
    

示例代码

以下是一个完整的示例应用程序:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_uae_pass/uae_pass.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? authCode;
  String? accessToken;
  ProfileData? profileData;

  final _uaePass = UaePass();

  [@override](/user/override)
  void initState() {
    super.initState();

    // 初始化生产环境
    _uaePass.setUpEnvironment(
      clientId: "<clientId>",
      clientSecret: "<clientSecret>",
      urlScheme: "myappscheme",
      redirectUri: "<redirectUri>",
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('UAE Pass'),
          centerTitle: true,
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              MaterialButton(
                onPressed: () => login(),
                child: const Text('Sign in with UAE Pass'),
              ),
              const SizedBox(height: 100),
              if (authCode != null)
                ListTile(
                  title: const Text('Auth Code'),
                  subtitle: Text('${authCode?.substring(0, 6)}............'),
                ),
              if (accessToken != null)
                ListTile(
                  title: const Text('Access Token'),
                  subtitle: Text('${accessToken?.substring(0, 6)}............'),
                ),
              if (profileData != null)
                Column(
                  children: [
                    ListTile(
                      title: const Text('Emirates Id'),
                      subtitle: Text(profileData?.idn ?? ""),
                    ),
                    ListTile(
                      title: const Text('Full Name EN'),
                      subtitle: Text(profileData?.fullnameEN ?? ""),
                    ),
                    ListTile(
                      title: const Text('Full Name AR'),
                      subtitle: Text(profileData?.fullnameAR ?? ""),
                    ),
                    ListTile(
                      title: const Text('Mobile'),
                      subtitle: Text(profileData?.mobile ?? ""),
                    ),
                    ListTile(
                      title: const Text('Nationality EN'),
                      subtitle: Text(profileData?.nationalityEN ?? ""),
                    ),
                  ],
                ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> login() async {
    authCode = null;
    accessToken = null;
    profileData = null;
    setState(() {});
    try {
      authCode = await _uaePass.signIn(); // 登录并获取授权码
      accessToken = await _uaePass.getAccessToken(authCode ?? ""); // 使用授权码获取访问令牌
      profileData = await _uaePass.getProfile(accessToken ?? ""); // 使用访问令牌获取用户信息

      setState(() {});
    } catch (e) {
      if (kDebugMode) {
        print(e.toString()); // 打印错误信息
      }
    }
    setState(() {});
  }
}

更多关于Flutter阿联酋身份验证插件flutter_uae_pass的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter阿联酋身份验证插件flutter_uae_pass的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用flutter_uae_pass插件的示例代码。这个插件假设用于阿联酋身份验证流程。请注意,实际使用时可能需要根据官方文档和API的具体要求进行调整。

首先,确保你的Flutter环境已经设置好,并且在pubspec.yaml文件中添加flutter_uae_pass依赖:

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

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用flutter_uae_pass插件:

  1. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter_uae_pass/flutter_uae_pass.dart';
  1. 初始化插件

通常,你可能需要在应用的初始化阶段配置插件。这里假设插件可能需要一些初始化设置,但具体细节请参考插件的官方文档。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 假设插件有一个初始化方法,这里仅为示例
  await FlutterUaePass.instance.initialize();

  runApp(MyApp());
}
  1. 使用插件进行身份验证

在你的UI代码中,你可以调用插件提供的方法进行身份验证。以下是一个简单的示例,展示如何启动身份验证流程:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await FlutterUaePass.instance.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('UAE Pass Authentication Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _startAuthentication,
            child: Text('Start Authentication'),
          ),
        ),
      ),
    );
  }

  Future<void> _startAuthentication() async {
    try {
      // 假设插件有一个startAuthentication方法,并返回一个结果
      UaePassAuthResult result = await FlutterUaePass.instance.startAuthentication(
        // 可能需要传递一些参数,例如请求的代码、回调URL等
        requestId: 'your-request-id',
        redirectUri: 'your-redirect-uri',
      );

      if (result.success) {
        // 处理成功的情况
        print('Authentication successful: ${result.data}');
      } else {
        // 处理失败的情况
        print('Authentication failed: ${result.error}');
      }
    } catch (e) {
      // 处理异常
      print('An error occurred: $e');
    }
  }
}

// 假设的UaePassAuthResult类,实际使用时请参考插件的文档
class UaePassAuthResult {
  final bool success;
  final String? data;
  final String? error;

  UaePassAuthResult({required this.success, this.data, this.error});
}

注意:上述代码中的FlutterUaePass.instance.startAuthentication方法及其参数requestIdredirectUri仅为示例,实际使用时请参考插件的官方文档以获取正确的方法和参数。

  1. 处理回调

如果你的身份验证流程涉及到重定向到某个URL或处理回调,你可能需要在你的应用中配置一个URL Scheme,并处理这些回调。这通常涉及到Android和iOS平台特定的配置,具体步骤请参考插件的官方文档。

请务必查阅flutter_uae_pass插件的官方文档和示例代码,以获得最准确和最新的使用方法。由于插件的具体实现和API可能会随时间变化,上述代码仅作为基本示例。

回到顶部