update
This commit is contained in:
27
lib/models/auth/auth_model.dart
Normal file
27
lib/models/auth/auth_model.dart
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import 'package:chat/models/user_info_model.dart';
|
||||||
|
|
||||||
|
class AuthModel {
|
||||||
|
String tokenType;
|
||||||
|
String accessToken;
|
||||||
|
String userSig;
|
||||||
|
String userID;
|
||||||
|
UserInfoModel userInfo;
|
||||||
|
|
||||||
|
String get userToken => '$tokenType $accessToken';
|
||||||
|
|
||||||
|
AuthModel({
|
||||||
|
required this.tokenType,
|
||||||
|
required this.accessToken,
|
||||||
|
required this.userID,
|
||||||
|
required this.userSig,
|
||||||
|
required this.userInfo,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory AuthModel.fromJson(Map<String, dynamic> json) => AuthModel(
|
||||||
|
tokenType: json['token_type'],
|
||||||
|
accessToken: json['access_token'],
|
||||||
|
userID: json['user_id'],
|
||||||
|
userSig: json['user_sig'],
|
||||||
|
userInfo: UserInfoModel.fromJson(json['user_info']),
|
||||||
|
);
|
||||||
|
}
|
||||||
21
lib/providers/auth_provider.dart
Normal file
21
lib/providers/auth_provider.dart
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import 'package:chat/models/auth/auth_model.dart';
|
||||||
|
import 'package:chat/utils/request/http.dart';
|
||||||
|
import 'package:chat/utils/ui_tools.dart';
|
||||||
|
|
||||||
|
class AuthProvider {
|
||||||
|
static Future<AuthModel?> login(String address) async {
|
||||||
|
try {
|
||||||
|
final result = await Http.post(
|
||||||
|
'auth/login',
|
||||||
|
data: {
|
||||||
|
'address': address,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
return AuthModel.fromJson(result);
|
||||||
|
} catch (e) {
|
||||||
|
UiTools.toast('区块链地址获取失败');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:chat/models/user_info_model.dart';
|
import 'package:chat/models/user_info_model.dart';
|
||||||
|
import 'package:chat/providers/auth_provider.dart';
|
||||||
import 'package:chat/routes/auth_routes.dart';
|
import 'package:chat/routes/auth_routes.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:get_storage/get_storage.dart';
|
import 'package:get_storage/get_storage.dart';
|
||||||
@@ -18,10 +19,12 @@ class AuthService extends GetxService {
|
|||||||
/// 供请求时调用,载入内存,是为了每次使用的时候,不需要从磁盘获取
|
/// 供请求时调用,载入内存,是为了每次使用的时候,不需要从磁盘获取
|
||||||
late String userId = '';
|
late String userId = '';
|
||||||
late String userSig = '';
|
late String userSig = '';
|
||||||
|
late String userToken = '';
|
||||||
|
|
||||||
/// 获取存储的token,这个可以做到持久化存储
|
/// 获取存储的token,这个可以做到持久化存储
|
||||||
String get _userSig => _box.read('userSig') ?? '';
|
|
||||||
String get _userId => _box.read('userId') ?? '';
|
String get _userId => _box.read('userId') ?? '';
|
||||||
|
String get _userSig => _box.read('userSig') ?? '';
|
||||||
|
String get _userToken => _box.read('userToken') ?? '';
|
||||||
|
|
||||||
Rx<UserInfoModel> userInfo = UserInfoModel.empty().obs;
|
Rx<UserInfoModel> userInfo = UserInfoModel.empty().obs;
|
||||||
|
|
||||||
@@ -29,27 +32,32 @@ class AuthService extends GetxService {
|
|||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
|
|
||||||
if (_userSig.isNotEmpty) {
|
if (_userToken.isNotEmpty) {
|
||||||
isLogin.value = true;
|
isLogin.value = true;
|
||||||
userSig = _userSig;
|
userSig = _userSig;
|
||||||
userId = _userId;
|
userId = _userId;
|
||||||
|
userToken = _userToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ever(_isLogin, (_) {
|
|
||||||
// if (_ == true) {
|
|
||||||
// Get.offAllNamed(AppRoutes.app);
|
|
||||||
// } else {
|
|
||||||
// Get.offAllNamed(AuthRoutes.index);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> login(String address) async {
|
Future<bool> login(String address) async {
|
||||||
_box.write('userId', '');
|
var result = await AuthProvider.login(address);
|
||||||
userId = '';
|
|
||||||
isLogin.value = true;
|
|
||||||
|
|
||||||
return true;
|
if (result != null) {
|
||||||
|
_box.write('userId', result.userID);
|
||||||
|
_box.write('userSig', result.userSig);
|
||||||
|
_box.write('userToken', result.userToken);
|
||||||
|
|
||||||
|
userId = result.userID;
|
||||||
|
userSig = result.userSig;
|
||||||
|
userToken = result.userToken;
|
||||||
|
|
||||||
|
isLogin.value = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 退出登录
|
/// 退出登录
|
||||||
@@ -57,8 +65,11 @@ class AuthService extends GetxService {
|
|||||||
await TencentImSDKPlugin.v2TIMManager.logout();
|
await TencentImSDKPlugin.v2TIMManager.logout();
|
||||||
_box.remove('userSig');
|
_box.remove('userSig');
|
||||||
_box.remove('userId');
|
_box.remove('userId');
|
||||||
|
_box.remove('userToken');
|
||||||
userSig = '';
|
userSig = '';
|
||||||
userId = '';
|
userId = '';
|
||||||
|
userToken = '';
|
||||||
|
|
||||||
userInfo.value = UserInfoModel.empty();
|
userInfo.value = UserInfoModel.empty();
|
||||||
isLogin.value = false;
|
isLogin.value = false;
|
||||||
Get.offAllNamed(AuthRoutes.index);
|
Get.offAllNamed(AuthRoutes.index);
|
||||||
|
|||||||
28
lib/utils/crypto_helper.dart
Normal file
28
lib/utils/crypto_helper.dart
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:encrypt/encrypt.dart';
|
||||||
|
import 'package:crypto/crypto.dart';
|
||||||
|
|
||||||
|
class CryptoHelper {
|
||||||
|
static IV iv = IV.fromLength(16);
|
||||||
|
|
||||||
|
/// 初始化加密
|
||||||
|
static Encrypter initEncrypter(String password) {
|
||||||
|
final List<int> bytes = utf8.encode(password);
|
||||||
|
final Digest md5Bytes = md5.convert(bytes);
|
||||||
|
final Key key = Key.fromUtf8(md5Bytes.toString());
|
||||||
|
return Encrypter(AES(key, mode: AESMode.ecb));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// AES 加密
|
||||||
|
static String encryptAes(String plainText, String password) {
|
||||||
|
Encrypter encrypter = CryptoHelper.initEncrypter(password);
|
||||||
|
return encrypter.encrypt(plainText, iv: iv).base64;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// AES 解密
|
||||||
|
static String decryptAes(String encrypted, String password) {
|
||||||
|
Encrypter encrypter = CryptoHelper.initEncrypter(password);
|
||||||
|
return encrypter.decrypt16(encrypted, iv: iv);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ class HttpInterceptor extends Interceptor {
|
|||||||
RequestInterceptorHandler handler,
|
RequestInterceptorHandler handler,
|
||||||
) {
|
) {
|
||||||
// 头部添加token
|
// 头部添加token
|
||||||
// options.headers['Authorization'] = AuthService.to.userToken;
|
options.headers['Authorization'] = AuthService.to.userToken;
|
||||||
options.headers['Accept'] = 'application/json';
|
options.headers['Accept'] = 'application/json';
|
||||||
|
|
||||||
super.onRequest(
|
super.onRequest(
|
||||||
|
|||||||
@@ -18,6 +18,11 @@ class _AuthImportPageState extends State<AuthImportPage> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
_editingController.text =
|
||||||
|
'demise sell awesome tragic faith village party elbow lady leopard wrestle civil';
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -49,12 +54,14 @@ class _AuthImportPageState extends State<AuthImportPage> {
|
|||||||
),
|
),
|
||||||
const Text('支持导入所有遵循BIP标准生成的助记词'),
|
const Text('支持导入所有遵循BIP标准生成的助记词'),
|
||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
onPressed: () {
|
onPressed: () async {
|
||||||
String? address =
|
String? address =
|
||||||
HDWallet.mnemonicToAddress(_editingController.text);
|
HDWallet.mnemonicToAddress(_editingController.text);
|
||||||
if (address != null) {
|
if (address != null) {
|
||||||
AuthService.to.login(address);
|
var result = await AuthService.to.login(address);
|
||||||
Get.offAllNamed(AppRoutes.app);
|
if (result) {
|
||||||
|
Get.offAllNamed(AppRoutes.app);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: const Text('开始导入'),
|
child: const Text('开始导入'),
|
||||||
|
|||||||
21
pubspec.lock
21
pubspec.lock
@@ -15,6 +15,20 @@ packages:
|
|||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.2"
|
version: "2.0.2"
|
||||||
|
args:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: args
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "2.3.1"
|
||||||
|
asn1lib:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: asn1lib
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "1.2.0"
|
||||||
async:
|
async:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -164,6 +178,13 @@ packages:
|
|||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.6"
|
version: "4.0.6"
|
||||||
|
encrypt:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: encrypt
|
||||||
|
url: "https://pub.flutter-io.cn"
|
||||||
|
source: hosted
|
||||||
|
version: "5.0.1"
|
||||||
extended_image:
|
extended_image:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ dependencies:
|
|||||||
photo_view: ^0.14.0
|
photo_view: ^0.14.0
|
||||||
photo_manager: 2.2.1
|
photo_manager: 2.2.1
|
||||||
chewie: ^1.3.5
|
chewie: ^1.3.5
|
||||||
|
encrypt: ^5.0.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|||||||
Reference in New Issue
Block a user