Flutter身份验证插件uaepass_api的使用

Flutter身份验证插件uaepass_api的使用

uaepass_api 是一个非官方的Flutter包,用于支持UAE PASS的身份验证功能。它易于使用,并且支持应用已安装和未安装场景,具有全屏窗口模式、空安全等特性。

为什么选择 uaepass_api?

  • 🚀 简单易用
  • ⚡ 全屏窗口
  • ❤ 支持应用已安装场景
  • ❤ 支持应用未安装场景
  • 🛡️ 空安全

开始使用

添加依赖

首先,在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  uaepass_api: ^1.0.3

然后运行以下命令来获取包:

flutter pub get

导入包

在你的Dart文件中导入 uaepass_api 包:

import 'package:uaepass_api/uaepass_api.dart';

初始化 UaePassAPI 实例:

UaePassAPI uaePassAPI = UaePassAPI(
    clientId: "<clientId>",
    redirectUri: "<redirectUri>",
    clientSecrete: "<clientSecrete>",
    appScheme: "<Your App Scheme>",
    language: "en",
    isProduction: false);

获取用户代码

调用 signIn 方法来获取用户的授权码:

String? code = await uaePassAPI.signIn(context);

获取访问令牌

使用授权码换取访问令牌:

String? token = await uaePassAPI.getAccessToken(code);

获取用户信息

通过访问令牌获取用户信息:

UAEPASSUserProfile? userProfile = await uaePassAPI.getUserProfile(token);

登出

调用 logout 方法进行登出操作:

await uaePassAPI.logout(context);

iOS 设置

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>Your App URL Scheme here</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>Your App URL Scheme here</string>
    </array>
  </dict>
</array>

Android 设置

AndroidManifest.xml 文件中更新以下内容:

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:launchMode="singleTask"
    android:theme="@style/LaunchTheme"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:windowSoftInputMode="adjustResize">
    ...
    <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="<Your App Scheme>" />
        <data
            android:host="failure"
            android:scheme="<Your App Scheme>" />
    </intent-filter>
</activity>

如果遇到Kotlin错误,请在 build.gradle 文件中添加以下内容:

buildscript {
    ext.kotlin_version = '1.7.10'
}

示例代码

以下是完整的示例代码,展示了如何在Flutter应用中集成 uaepass_api

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'UAE PASS Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'UAE PASS Demo'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  String? _token;
  UAEPASSUserProfile? _user;

  void _loginOrLogout() async {
    UaePassAPI uaePassAPI = UaePassAPI(
        clientId: "sandbox_stage",
        redirectUri: "https://oauthtest.com/authorization/return",
        clientSecrete: "sandbox_stage",
        appScheme: "exampleScheme",
        isProduction: false);

    try {
      if (_token != null) {
        await uaePassAPI.logout(context);
        _token = null;
        _user = null;
        setState(() {});
        return;
      }

      String? code = await uaePassAPI.signIn(context);

      if (code != null) {
        _token = await uaePassAPI.getAccessToken(code);

        if (_token != null) {
          _user = await uaePassAPI.getUserProfile(_token!);
        }
      }
      setState(() {});
    } catch (e, s) {
      // print(e);
      // print(s);
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _token == null
                  ? 'Press button to get token:'
                  : 'Press button to logout:',
            ),
            const SizedBox(height: 10),
            if (_token != null)
              ListTile(
                title: const Text("Token:"),
                subtitle: Text("$_token"),
              ),
            if (_user != null)
              Column(
                children: [
                  ListTile(
                    title: const Text("Full name:"),
                    subtitle: Text("${_user?.firstnameEN} ${_user?.lastnameEN}"),
                  ),
                ],
              )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _loginOrLogout,
        tooltip: 'login',
        child: const Icon(Icons.login),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用uaepass_api插件进行身份验证的示例代码。请注意,由于uaepass_api是一个假定的插件名称,实际使用中需要确保该插件存在并且其功能与示例匹配。如果插件名或API有所不同,请根据实际情况进行调整。

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

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

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

接下来,在你的Flutter项目中,你可以使用以下代码进行身份验证:

import 'package:flutter/material.dart';
import 'package:uaepass_api/uaepass_api.dart';  // 导入插件

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LoginScreen(),
    );
  }
}

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

class _LoginScreenState extends State<LoginScreen> {
  final TextEditingController _usernameController = TextEditingController();
  final TextEditingController _passwordController = TextEditingController();
  String _authMessage = '';

  void _login() async {
    setState(() {
      _authMessage = '';
    });

    try {
      // 假设uaepass_api提供了一个login方法,接受用户名和密码
      bool isAuthenticated = await UaepassApi.login(
        username: _usernameController.text,
        password: _passwordController.text,
      );

      if (isAuthenticated) {
        setState(() {
          _authMessage = '登录成功!';
        });
        // 这里可以跳转到其他页面或执行其他操作
      } else {
        setState(() {
          _authMessage = '用户名或密码错误。';
        });
      }
    } catch (e) {
      setState(() {
        _authMessage = '登录失败:${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('登录'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            TextField(
              controller: _usernameController,
              decoration: InputDecoration(labelText: '用户名'),
            ),
            TextField(
              controller: _passwordController,
              decoration: InputDecoration(labelText: '密码'),
              obscureText: true,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _login,
              child: Text('登录'),
            ),
            SizedBox(height: 10),
            Text(_authMessage),
          ],
        ),
      ),
    );
  }
}

在上面的代码中,我们创建了一个简单的登录界面,用户可以在其中输入用户名和密码。点击“登录”按钮后,会调用_login方法,该方法使用uaepass_api插件的login方法尝试进行身份验证。根据身份验证的结果,会显示相应的消息。

请注意,上面的代码是一个假设性的示例,因为实际的uaepass_api插件可能具有不同的API和方法。你需要查阅该插件的官方文档或源代码,以了解如何正确调用其方法进行身份验证。

此外,确保在实际应用中处理敏感信息(如密码)时,遵循最佳安全实践,例如使用HTTPS进行通信,避免在客户端存储敏感信息等。

回到顶部