Flutter账户管理插件odds_account_sdk的使用

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

Flutter账户管理插件odds_account_sdk的使用

特性

OddsHorizon 客户端账户 SDK。

入门指南

添加依赖

dependencies:
  odds_account_sdk: ^1.0.0

使用方法

SDK 提供了两种不同的账号认证流程 API:

  • 由客户端程序自行处理用户录入的身份凭据进行认证的核心认证流程
  • 通过跳转到账号系统自身的认证页面进行认证的OIDC 标准认证流程

更推荐使用第二种OIDC 标准认证流程,开发工作量更小,安全性也更高。相比由客户端自行开发登录/注册页面及相应的处理逻辑,可以节约 9成 的开发时间。

通用初始化流程

导入模块并创建基于 Authing 服务提供方的 OddsAccountClient 实例。

import 'package:odds_account_sdk/client.dart';

final OddsAccountClient client = OddsAccountClient.authing(
    "$userPoolId", "$appId", "$redirectBackUri");

await client.init();

创建 client 实例的参数 userPoolId, appIdredirectBackUri 均可以在 Authing 控制台查看。

注意:如果没有在 Authing 控制台修改默认的回调地址,则 redirectBackUri 参数可以不传。

OIDC 标准认证流程(推荐)

1. 生成认证页面的 URI

final OidcAuthSession session = client.createOidcAuthSession();
final String uri = session.getAuthPageUri();

// 使用 WebView 或其他网页容器导航此 URI

2. 根据用户操作身份认证页面后的回调 URI 中的信息换取 token

WebView(
  initialUrl: uri,
  javascriptMode: JavascriptMode.unrestricted,
  gestureNavigationEnabled: true,
  onPageFinished: (String uri) async {
    final Result<AuthInfo> result = await session.obtainAuthInfoByRedirectUri(uri);
    
    if (result.isSuccess()) {
      final AuthInfo authInfo = result.data;
      currentAccount = authInfo.account;
      accessToken = authInfo.accessToken;
      refreshToken = authInfo.refreshToken;
    }
  }
);

3. 将 accessToken 放置到 gRPC 请求的 metadata 中调用后端服务

4. 在 accessToken 过期前,使用 refreshToken 进行更新

final Result<AuthInfo> result = await client.renewToken(refreshToken);

refreshToken 的存活时间一般比较长,所以可以用来刷新存活期较短的 accessToken。如果在执行 renewToken 时结果返回的 statusCode 为 401,则表示 refreshToken 也过期了,需要用户重新登录。

退出登录

client.logout();

更多关于Flutter账户管理插件odds_account_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter账户管理插件odds_account_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用odds_account_sdk插件进行账户管理的示例代码。请注意,odds_account_sdk是一个假设的插件名称,实际使用时需要替换为真实存在的插件。假设该插件提供了用户登录、注册和获取用户信息的功能。

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

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

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

接下来,在你的Flutter项目中创建一个账户管理页面。这里是一个简单的示例,展示了如何使用odds_account_sdk进行用户登录、注册和获取用户信息。

import 'package:flutter/material.dart';
import 'package:odds_account_sdk/odds_account_sdk.dart';  // 假设插件的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Account Management',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AccountManagementPage(),
    );
  }
}

class AccountManagementPage extends StatefulWidget {
  @override
  _AccountManagementPageState createState() => _AccountManagementPageState();
}

class _AccountManagementPageState extends State<AccountManagementPage> {
  final _formKey = GlobalKey<FormState>();
  String _email = '';
  String _password = '';
  String _userInfo = '';

  void _login() async {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();
      try {
        bool loggedIn = await OddsAccountSdk.login(email: _email, password: _password);
        if (loggedIn) {
          setState(() {
            _userInfo = await OddsAccountSdk.getUserInfo();
          });
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Login successful')));
        } else {
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Login failed')));
        }
      } catch (e) {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Error: $e')));
      }
    }
  }

  void _register() async {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();
      try {
        bool registered = await OddsAccountSdk.register(email: _email, password: _password);
        if (registered) {
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Registration successful')));
        } else {
          ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Registration failed')));
        }
      } catch (e) {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Error: $e')));
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Account Management'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  if (value == null || value.isEmpty || !value.contains('@')) {
                    return 'Please enter a valid email address.';
                  }
                  return null;
                },
                onSaved: (value) {
                  _email = value!;
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Password'),
                obscureText: true,
                validator: (value) {
                  if (value == null || value.isEmpty || value.length < 6) {
                    return 'Password must be at least 6 characters long.';
                  }
                  return null;
                },
                onSaved: (value) {
                  _password = value!;
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _login,
                child: Text('Login'),
              ),
              SizedBox(height: 10),
              ElevatedButton(
                onPressed: _register,
                child: Text('Register'),
              ),
              SizedBox(height: 20),
              Text('User Info: $_userInfo'),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个表单用于输入电子邮件和密码。用户可以通过点击“Login”按钮登录,或者通过点击“Register”按钮注册。登录成功后,应用会显示用户信息(这里假设OddsAccountSdk.getUserInfo()方法返回用户信息)。

请注意,OddsAccountSdk及其方法(如loginregistergetUserInfo)是假设存在的。在实际使用中,你需要根据odds_account_sdk插件的文档来调整代码。如果插件提供了不同的方法或参数,你需要相应地修改代码。

回到顶部