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
更多关于Flutter插件plugin_tozny的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
plugin_tozny
是一个 Flutter 插件,用于与 Tozny 的加密和身份验证服务集成。Tozny 提供了一套强大的加密工具,用于保护数据的安全性和隐私性。通过 plugin_tozny
,开发者可以在 Flutter 应用中轻松集成 Tozny 的功能,如数据加密、解密、身份验证等。
潜在使用场景
-
数据加密与解密:
- 使用 Tozny 的加密服务,开发者可以在应用中加密敏感数据,确保数据在传输和存储过程中的安全性。
- 例如,加密用户的个人信息、支付信息等,防止数据泄露。
-
身份验证:
- Tozny 提供了强大的身份验证机制,可以用于用户登录、多因素认证等场景。
- 通过
plugin_tozny
,开发者可以轻松集成这些功能,提升应用的安全性。
-
安全存储:
- 使用 Tozny 的加密服务,开发者可以将敏感数据安全地存储在本地或云端。
- 例如,加密存储用户的密码、密钥等,防止未经授权的访问。
-
安全通信:
- Tozny 的加密服务可以用于保护应用中的通信数据,确保数据在传输过程中不被窃取或篡改。
- 例如,加密聊天消息、文件传输等,保护用户的隐私。
-
数据共享:
- 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'),
],
);
}
}