Flutter插件plugin_tozny的使用

plugin_tozny介绍

plugin_tozny是一个正在开发中的 Flutter 插件,用于使用 Tozny 的产品(如 TozStore 和 TozId)来加密和保护数据、应用程序以及身份。

plugin_tozny的使用

在您的 Dart 或 Flutter 项目中,通过在 pubspec.yaml文件中添加plugin_tozny作为依赖项来使用它:

plugin_tozny:
  git:
    url: git://github.com/tozny/flutter-plugin
    ref: 0.0.5

端到端 TozId 身份注册、登录与 TozStore 加密文件存储示例

在创建一个 Realm(仅使用小写字母命名)并获取一个注册令牌后,更新以下示例中的 Realm 名称和注册令牌值,然后可以运行以下示例函数以注册新的身份、登录并加密写入数据到 TozStore。

import 'package:plugin_tozny/plugin_tozny.dart';
import 'package:plugin_tozny/plugin_identity.dart';
import 'package:plugin_tozny/plugin_realm.dart';
import 'package:plugin_tozny/tozny_model.dart';

void registerLoginStoreFileExample() async {
  RealmConfig realmConfig = new RealmConfig.fromJson({
    "realm_name": "example",
    "app_name": "account", // 当前唯一支持的值
    "broker_target_url": "https://id.tozny.com/example/recover", // 默认形式为 https://<TozIdBaseURL>/<YourRealmName>/recover,使用 Tozny 托管的 broker 计算函数进行密码恢复流
    "api_url": "https://api.e3db.com" // SaaS 客户默认值
  });
  var realmClient = PluginRealm(realmConfig);

  try {
    var username = 'example';
    var email = 'example@example.com'; // 注意,用户名和密码可以相同,如果用户名是有效的电子邮件
    var password = 'StrongpassW0rd1!';
    var realmIdentity = await realmClient.register(
        username,
        password,
        '10a0cd84416e0950e345EXAMPLE813ec34a32ce1e9f76e3c192c932d2add', // 您的注册令牌在此处
        email,
        'FirstName',
        'LastName',
        60);
    print("Registered Realm Identity ${realmIdentity.toJson().toString()}");

    try {
      var loggedInIdentity = await realmClient.login(username, password);
      print(
          "Logged  into Realm as Identity ${loggedInIdentity.config.toJson().toString()}");

      try {
        var absoluteFilePath = await writeExampleFile();
        var recordType = "android-gyroscope-sensor-data";
        var searchableRecordMetadata = {
          "sensor-category": "movement",
          "collection-timestamp": "1615146901",
          "anonymous-participant-id": "u-u-i-d",
        };
        var storedRecordDetails = await loggedInIdentity.client.writeFile(
            recordType, absoluteFilePath, searchableRecordMetadata);
        print("Wrote file Record ${storedRecordDetails.toJson().toString()}");

      } catch (e, s) {
        print(e);
        print(s);
      }
    } catch (e, s) {
      print(e);
      print(s);
    }
  } catch (e, s) {
    print(e);
    print(s);
  }
}

Future<String> writeExampleFile() async {
  final directory = await getApplicationDocumentsDirectory();
  var filename = "example.txt";
  final path = '${directory.path}/$filename';
  var file = new File(path);
  var sink = file.openWrite();
  sink.write('example');
  await sink.close();
  return file.absolute.path;
}

运行上述示例并在替换示例值(Realm 名称、注册令牌、用户名和电子邮件)后,将在模拟器或设备控制台中输出类似以下内容的文本:

I/flutter ( 6719): Registered Realm Identity {client_credentials: {api_key_id: fbd4b8EXAMPLE8b180a88435eec7c4e7e60e6873e820a9d, api_secret: b43de1815737df6c4EXAMPLE83ccf45991a0118c415ba3d0cd86735f, client_id: fa7da2d4-1486-41ab-8d68-accf01c27a3e, client_email: , public_key: xCNRuxVh-83qYV7WQ1EXAMPLLUygwN_-GbijgQ, private_key: yi_UZqiQ1BpYxF2X3i0kGjUmP3AmvkEXAMPL, public_signing_key: QI8-D-dl5y3bgl2CFUFIykfPJ0KaXdz505YPGpYRYeg, private_signing_key: kradKCZbLCVu0m61-rZILQtgEjqhVBRsW3MhilYLnG1Ajz4P52XnLduCXYIVQUjKR88nQppdEXAMPL, api_url: https://api.e3db.com}, identity_config: {api_url: , appName: null, broker_target_url: https://id.tozny.com/flutter/recover, realm_name: flutter, user_id: 1786, username: example2}}
I/flutter ( 6719): Logged  into Realm as Identity {client_credentials: {api_key_id: fbd4b81604971a8fa5977958c646EXAMPL7c4e7e60e6873e820a9d, api_secret: b43de1815737df6EXAMPELcf45991a0118c415ba3d0cd86735f, client_id: fa7da2d4-1486-41ab-8d68-accf01c27a3e, client_email: , public_key: xCNRuxVh-83EXAMPLCkLoLUygwN_-GbijgQ, private_key: yi_UZqiQ1BpYxF2X3i0kGjUmP3AmEXAMPL, public_signing_key: QI8-D-dl5y3bgl2CFUFIykfPJ0KaXdz505YPGpYRYeg, private_signing_key: kradKCZbLCVu0m61-rZILQtgEjqhVBRsW3MhilYLnG1Ajz4P52XnLduCXYIVQUjKR88nEXAMPL, api_url: https://api.e3db.com}, identity_config: {api_url: , appName: null, broker_target_url: https://id.tozny.com/flutter/recover, realm_name: flutter, user_id: 1786, username: example2}, user_agent_token: {access_token: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJnTWlGYWVxMFZVRjFzN1NXTW90UzJEWU9nT0s1UC1zQ2N2UkZhcVV1N2EwIn0.eyJleHAiOjE2MTUxNjQ1NzIsImlhdCI6MTYxNTE2MDk3MiwiYXV0aF90aW1lIjoxNjE1MTYwOTcyLCJqdGkiOiI0NDI3MWRiMC00ZmFmLTQ0NzQtEXAMPL
I/flutter ( 6719): Wrote file Record {record_id: 0901582a-1ae2-4e42-8435-f74212ea86f8, writer_id: fa7da2d4-1486-41ab-8d68-accf01c27a3e, user_id: fa7da2d4-1486-41ab-8d68-accf01c27a3e, created: 2021-03-08T07:49:33.000Z, last_modified: 2021-03-08T07:49:33.000Z, version: 91af53ee-0575-4a73-bbc2-ee0803038f25, type: android-gyroscope-sensor-data, plain: {sensor-category: movement, anonymous-participant-id: u-u-i-d, collection-timestamp: 1615146901}, file: {file_url: null, file_name: 91b18cc7-cb08-4372-ac94-baab6cae31b4-1615160973, checksum: vwItq0yNXV2q/QzrhLd6Fw==, compression: RAW, size: null}}

当前限制

  • 插件实现了原生 SDK 提供的所有方法和类的部分集合(e3db-java/e3db-swift)。

完整示例 Demo

以下是完整的示例代码,展示如何使用 plugin_tozny 进行身份注册、登录以及文件加密存储。

示例代码

import 'dart:async';
import 'dart:developer' as developer;
import 'dart:io';
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:plugin_tozny/plugin_realm.dart';
import 'package:plugin_tozny/plugin_tozny.dart';
import 'package:plugin_tozny/tozny_model.dart';
import 'package:plugin_tozny/plugin_identity.dart';

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  String _loggedInIdentity = "None";
  String _publicSigningKey = "None";

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

  // 平台消息异步处理
  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = await PluginTozny.platformVersion;
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    } catch (e) {
      platformVersion = e.toString();
    }
    if (!mounted) return;
    setState(() {
      _platformVersion = platformVersion;
    });
  }

  // 注册身份并登录
  void registerIdentityOnButtonPress() async {
    String apiUrl = "https://api.e3db.com";
    String appName = "account";
    String realmName = "MatthewToznyRealm20210813";
    String brokerTargetUrl = "https://id.tozny.com/matthewtoznyrealm20210813/recover";
    String username = "user";
    String password = "password123";

    try {
      var realmCreds = RealmConfig(realmName: realmName, appName: appName, apiURL: apiUrl, brokerTargetURL: brokerTargetUrl);
      var token = "a806d72297efe704b8197e6046597245729c72a8cd9400f8dbecca7ad30186a4";
      await registerIdentityAndLogin(realmCreds, token);
    } catch (e) {
      developer.log("Example flow failed because $e");
    }
  }

  void registerIdentityAndLogin(RealmConfig config, String regToken) async {
    var realmClient = new PluginRealm(config);
    Random random = new Random();
    var username = random.nextInt(10000).toString();
    try {
      print("before register");
      await realmClient.register(
          username, "pass", regToken, "test@example.com", "test", "user", 60);
      print("logging in");
      var loggedInIdentity = await realmClient.login(username, "pass");
      print("writing record with identity");
      var record = await writeRecord(loggedInIdentity.client);
      print(record.toJson().toString());
      setState(() {
        _platformVersion = "Registered identity, logged in, and wrote a record";
      });
    } catch (e) {
      print("error $e");
    }
  }

  // 写入文件
  Future<RecordMeta> writeFile(PluginTozny client) async {
    try {
      final directory = await getApplicationDocumentsDirectory();
      var filename = "test_file.txt";
      final path = '${directory.path}/$filename';
      var file = new File(path);
      var sink = file.openWrite();
      sink.write('some encrypted content');
      await sink.close();
      var plain = {"plain": "file"};
      developer.log(file.absolute.path);
      var recordMeta =
          await client.writeFile("testFileType1", file.absolute.path, plain);
      setState(() {
        _platformVersion = "written file record: " + recordMeta.recordID;
      });
      return recordMeta;
    } catch (e) {
      developer.log("sdkfjlaskjdf" + e.toString());
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Stack(
          children: <Widget>[
            Center(
              child: RaisedButton(
                child: Text('Register and Login'),
                onPressed: registerIdentityOnButtonPress,
              ),
            ),
            Column(
              children: [
                Text('Running on: $_platformVersion'),
                Text('Logged in identity: $_loggedInIdentity'),
                Text('Public Signing Key: $_publicSigningKey'),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


plugin_tozny 是一个 Flutter 插件,用于与 Tozny 的加密和身份验证服务集成。Tozny 提供了一套强大的加密工具,用于保护数据的安全性和隐私性。通过 plugin_tozny,开发者可以在 Flutter 应用中轻松集成 Tozny 的功能,如数据加密、解密、身份验证等。

潜在使用场景

  1. 数据加密与解密

    • 使用 Tozny 的加密服务,开发者可以在应用中加密敏感数据,确保数据在传输和存储过程中的安全性。
    • 例如,加密用户的个人信息、支付信息等,防止数据泄露。
  2. 身份验证

    • Tozny 提供了强大的身份验证机制,可以用于用户登录、多因素认证等场景。
    • 通过 plugin_tozny,开发者可以轻松集成这些功能,提升应用的安全性。
  3. 安全存储

    • 使用 Tozny 的加密服务,开发者可以将敏感数据安全地存储在本地或云端。
    • 例如,加密存储用户的密码、密钥等,防止未经授权的访问。
  4. 安全通信

    • Tozny 的加密服务可以用于保护应用中的通信数据,确保数据在传输过程中不被窃取或篡改。
    • 例如,加密聊天消息、文件传输等,保护用户的隐私。
  5. 数据共享

    • Tozny 提供了安全的数据共享机制,允许用户在不泄露数据的情况下共享信息。
    • 通过 plugin_tozny,开发者可以实现安全的数据共享功能,例如共享加密文件、文档等。

使用示例

以下是一个简单的示例,展示如何使用 plugin_tozny 进行数据加密和解密:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Tozny Plugin Example'),
        ),
        body: Center(
          child: ToznyExample(),
        ),
      ),
    );
  }
}

class ToznyExample extends StatefulWidget {
  [@override](/user/override)
  _ToznyExampleState createState() => _ToznyExampleState();
}

class _ToznyExampleState extends State<ToznyExample> {
  String _encryptedData = '';
  String _decryptedData = '';

  Future<void> _encryptData() async {
    final tozny = PluginTozny();
    final encrypted = await tozny.encrypt('Sensitive Data');
    setState(() {
      _encryptedData = encrypted;
    });
  }

  Future<void> _decryptData() async {
    final tozny = PluginTozny();
    final decrypted = await tozny.decrypt(_encryptedData);
    setState(() {
      _decryptedData = decrypted;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: _encryptData,
          child: Text('Encrypt Data'),
        ),
        SizedBox(height: 20),
        Text('Encrypted Data: $_encryptedData'),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _decryptData,
          child: Text('Decrypt Data'),
        ),
        SizedBox(height: 20),
        Text('Decrypted Data: $_decryptedData'),
      ],
    );
  }
}
回到顶部