fix: logout

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-25 17:07:41 +08:00
parent a115b5e91b
commit 74e8b66546
7 changed files with 144 additions and 129 deletions

View File

@@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:PiliPlus/build_config.dart'; import 'package:PiliPlus/build_config.dart';
import 'package:PiliPlus/http/constants.dart'; import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/services/loggeer.dart'; import 'package:PiliPlus/services/loggeer.dart';
import 'package:PiliPlus/utils/login.dart';
import 'package:cookie_jar/cookie_jar.dart'; import 'package:cookie_jar/cookie_jar.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -313,7 +314,7 @@ Commit Hash: ${BuildConfig.commitHash}''',
Get.back(); Get.back();
try { try {
dynamic res = jsonDecode(data.text!); dynamic res = jsonDecode(data.text!);
Utils.afterLoginByApp( LoginUtils.onLogin(
res['accessKey'], res['accessKey'],
{'cookies': res['cookies']}, {'cookies': res['cookies']},
); );

View File

@@ -5,8 +5,8 @@ import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/icon_button.dart'; import 'package:PiliPlus/common/widgets/icon_button.dart';
import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/login.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -84,7 +84,7 @@ class LoginPageController extends GetxController
if (value['status']) { if (value['status']) {
t.cancel(); t.cancel();
statusQRCode.value = '扫码成功'; statusQRCode.value = '扫码成功';
await Utils.afterLoginByApp( await LoginUtils.onLogin(
value['data'], value['data']['cookie_info']); value['data'], value['data']['cookie_info']);
Get.back(); Get.back();
} else if (value['code'] == 86038) { } else if (value['code'] == 86038) {
@@ -221,7 +221,7 @@ class LoginPageController extends GetxController
); );
if (result.data['code'] == 0) { if (result.data['code'] == 0) {
try { try {
await Utils.afterLoginByApp( await LoginUtils.onLogin(
{'mid': '${result.data['data']['mid']}'}, {'mid': '${result.data['data']['mid']}'},
{ {
'cookies': 'cookies':
@@ -435,7 +435,7 @@ class LoginPageController extends GetxController
return; return;
} }
SmartDialog.showToast('正在保存身份信息'); SmartDialog.showToast('正在保存身份信息');
await Utils.afterLoginByApp( await LoginUtils.onLogin(
data['token_info'], data['cookie_info']); data['token_info'], data['cookie_info']);
Get.back(); Get.back();
Get.back(); Get.back();
@@ -454,7 +454,7 @@ class LoginPageController extends GetxController
return; return;
} }
SmartDialog.showToast('正在保存身份信息'); SmartDialog.showToast('正在保存身份信息');
await Utils.afterLoginByApp(data['token_info'], data['cookie_info']); await LoginUtils.onLogin(data['token_info'], data['cookie_info']);
Get.back(); Get.back();
} else { } else {
// handle login result // handle login result
@@ -517,7 +517,7 @@ class LoginPageController extends GetxController
if (res['status']) { if (res['status']) {
SmartDialog.showToast('登录成功'); SmartDialog.showToast('登录成功');
var data = res['data']; var data = res['data'];
await Utils.afterLoginByApp(data['token_info'], data['cookie_info']); await LoginUtils.onLogin(data['token_info'], data['cookie_info']);
Get.back(); Get.back();
} else { } else {
SmartDialog.showToast(res['msg']); SmartDialog.showToast(res['msg']);

View File

@@ -1,5 +1,4 @@
import 'package:PiliPlus/pages/about/index.dart'; import 'package:PiliPlus/pages/about/index.dart';
import 'package:PiliPlus/pages/main/controller.dart';
import 'package:PiliPlus/pages/setting/extra_setting.dart'; import 'package:PiliPlus/pages/setting/extra_setting.dart';
import 'package:PiliPlus/pages/setting/play_setting.dart'; import 'package:PiliPlus/pages/setting/play_setting.dart';
import 'package:PiliPlus/pages/setting/privacy_setting.dart'; import 'package:PiliPlus/pages/setting/privacy_setting.dart';
@@ -9,8 +8,9 @@ import 'package:PiliPlus/pages/setting/video_setting.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/login.dart'; import 'package:PiliPlus/utils/login.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../http/init.dart'; import '../../http/init.dart';
@@ -205,22 +205,26 @@ class _SettingPageState extends State<SettingPage> {
), ),
TextButton( TextButton(
onPressed: () async { onPressed: () async {
// 清空cookie SmartDialog.showLoading();
await Request.cookieManager.cookieJar.deleteAll(); dynamic res = await Request().post(
await CookieManager().deleteAllCookies(); 'https://passport.bilibili.com/login/exit/v2',
Request.dio.options.headers['cookie'] = ''; data: {
// 清空本地存储的用户标识 'biliCSRF': await Request.getCsrf(),
GStorage.userInfo.put('userInfoCache', null); },
GStorage.localCache.put(LocalCacheKey.accessKey, options: Options(
{'mid': -1, 'value': '', 'refresh': ''}); contentType:
_isLogin.value = false; Headers.formUrlEncodedContentType,
if (Get.isRegistered<MainController>()) { ),
MainController mainController = );
Get.find<MainController>(); if (res.data['code'] == 0) {
mainController.isLogin.value = false; await LoginUtils.onLogout();
_isLogin.value = false;
SmartDialog.dismiss();
Get.back();
} else {
SmartDialog.dismiss();
SmartDialog.showToast('${res.data['message']}');
} }
await LoginUtils.onLogout();
Get.back();
}, },
child: const Text('确认'), child: const Text('确认'),
) )

View File

@@ -1,24 +1,137 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/dynamics_type.dart'; import 'package:PiliPlus/models/common/dynamics_type.dart';
import 'package:PiliPlus/models/user/info.dart'; import 'package:PiliPlus/models/user/info.dart';
import 'package:PiliPlus/models/user/stat.dart'; import 'package:PiliPlus/models/user/stat.dart';
import 'package:PiliPlus/pages/dynamics/tab/controller.dart'; import 'package:PiliPlus/pages/dynamics/tab/controller.dart';
import 'package:PiliPlus/pages/live/controller.dart'; import 'package:PiliPlus/pages/live/controller.dart';
import 'package:PiliPlus/pages/main/controller.dart';
import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage.dart';
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:PiliPlus/pages/dynamics/index.dart'; import 'package:PiliPlus/pages/dynamics/index.dart';
import 'package:PiliPlus/pages/home/index.dart'; import 'package:PiliPlus/pages/home/index.dart';
import 'package:PiliPlus/pages/media/index.dart'; import 'package:PiliPlus/pages/media/index.dart';
import 'package:PiliPlus/pages/mine/index.dart'; import 'package:PiliPlus/pages/mine/index.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
import 'package:webview_cookie_manager/webview_cookie_manager.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart' as web;
import 'package:PiliPlus/pages/dynamics/controller.dart';
import 'package:PiliPlus/pages/home/controller.dart';
import 'package:PiliPlus/pages/media/controller.dart';
import 'package:PiliPlus/pages/mine/controller.dart';
import 'package:PiliPlus/http/user.dart';
class LoginUtils { class LoginUtils {
static Future onLogin(Map<String, dynamic> token_info, cookie_info) async {
try {
GStorage.localCache.put(LocalCacheKey.accessKey, {
'mid': token_info['mid'],
'value': token_info['access_token'] ?? token_info['value'],
'refresh': token_info['refresh_token'] ?? token_info['refresh']
});
List<dynamic> cookieInfo = cookie_info['cookies'];
List<Cookie> cookies = [];
String cookieStrings = cookieInfo.map((cookie) {
String cstr =
'${cookie['name']}=${cookie['value']};Domain=.bilibili.com;Path=/;';
cookies.add(Cookie.fromSetCookieValue(cstr));
return cstr;
}).join('');
List<String> urls = [
HttpString.baseUrl,
HttpString.apiBaseUrl,
HttpString.tUrl
];
for (var url in urls) {
await Request.cookieManager.cookieJar
.saveFromResponse(Uri.parse(url), cookies);
}
Request.dio.options.headers['cookie'] = cookieStrings;
await WebviewCookieManager().setCookies(cookies);
for (Cookie item in cookies) {
await web.CookieManager().setCookie(
url: web.WebUri(item.domain ?? ''),
name: item.name,
value: item.value,
path: item.path ?? '',
domain: item.domain,
isSecure: item.secure,
isHttpOnly: item.httpOnly,
);
}
} catch (e) {
SmartDialog.showToast('设置登录态失败,$e');
}
final result = await UserHttp.userInfo();
if (result['status'] && result['data'].isLogin) {
SmartDialog.showToast('登录成功,当前采用「'
'${GStorage.setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'app')}'
'端」推荐');
await GStorage.userInfo.put('userInfoCache', result['data']);
try {
Get.find<MineController>()
..isLogin.value = true
..queryUserInfo();
} catch (_) {}
try {
Get.find<HomeController>()
..isLogin.value = true
..userFace.value = result['data'].face;
} catch (_) {}
try {
Get.find<DynamicsController>()
..isLogin.value = true
..ownerMid = result['data'].mid
..face = result['data'].face
..onRefresh();
} catch (_) {}
for (int i = 0; i < tabsConfig.length; i++) {
try {
Get.find<DynamicsTabController>(tag: tabsConfig[i]['tag'])
.onRefresh();
} catch (_) {}
}
try {
Get.find<MediaController>()
..mid = result['data'].mid
..onRefresh();
} catch (_) {}
try {
Get.find<LiveController>()
..isLogin.value = true
..fetchLiveFollowing();
} catch (_) {}
} else {
// 获取用户信息失败
SmartDialog.showNotify(
msg: '登录失败请检查cookie是否正确${result['message']}',
notifyType: NotifyType.warning);
}
}
static Future onLogout() async { static Future onLogout() async {
await Request.cookieManager.cookieJar.deleteAll();
await web.CookieManager().deleteAllCookies();
Request.dio.options.headers['cookie'] = '';
await GStorage.userInfo.delete('userInfoCache'); await GStorage.userInfo.delete('userInfoCache');
await GStorage.localCache.delete(LocalCacheKey.accessKey);
try {
Get.find<MainController>().isLogin.value = false;
} catch (_) {}
try { try {
Get.find<MineController>() Get.find<MineController>()

View File

@@ -10,19 +10,11 @@ import 'package:PiliPlus/http/constants.dart';
import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/http/member.dart'; import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/http/search.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/http/video.dart'; import 'package:PiliPlus/http/video.dart';
import 'package:PiliPlus/models/bangumi/info.dart'; import 'package:PiliPlus/models/bangumi/info.dart';
import 'package:PiliPlus/models/common/dynamics_type.dart';
import 'package:PiliPlus/models/common/search_type.dart'; import 'package:PiliPlus/models/common/search_type.dart';
import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/models/live/item.dart'; import 'package:PiliPlus/models/live/item.dart';
import 'package:PiliPlus/pages/dynamics/controller.dart';
import 'package:PiliPlus/pages/dynamics/tab/controller.dart';
import 'package:PiliPlus/pages/home/controller.dart';
import 'package:PiliPlus/pages/live/controller.dart';
import 'package:PiliPlus/pages/media/controller.dart';
import 'package:PiliPlus/pages/mine/controller.dart';
import 'package:PiliPlus/pages/video/detail/introduction/widgets/group_panel.dart'; import 'package:PiliPlus/pages/video/detail/introduction/widgets/group_panel.dart';
import 'package:PiliPlus/utils/extension.dart'; import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/feed_back.dart';
@@ -37,8 +29,6 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:webview_cookie_manager/webview_cookie_manager.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart' as web;
import 'package:html/dom.dart' as dom; import 'package:html/dom.dart' as dom;
import 'package:html/parser.dart' as html_parser; import 'package:html/parser.dart' as html_parser;
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
@@ -296,99 +286,6 @@ class Utils {
} }
} }
static Future afterLoginByApp(
Map<String, dynamic> token_info, cookie_info) async {
try {
GStorage.localCache.put(LocalCacheKey.accessKey, {
'mid': token_info['mid'],
'value': token_info['access_token'] ?? token_info['value'],
'refresh': token_info['refresh_token'] ?? token_info['refresh']
});
List<dynamic> cookieInfo = cookie_info['cookies'];
List<Cookie> cookies = [];
String cookieStrings = cookieInfo.map((cookie) {
String cstr =
'${cookie['name']}=${cookie['value']};Domain=.bilibili.com;Path=/;';
cookies.add(Cookie.fromSetCookieValue(cstr));
return cstr;
}).join('');
List<String> urls = [
HttpString.baseUrl,
HttpString.apiBaseUrl,
HttpString.tUrl
];
for (var url in urls) {
await Request.cookieManager.cookieJar
.saveFromResponse(Uri.parse(url), cookies);
}
Request.dio.options.headers['cookie'] = cookieStrings;
await WebviewCookieManager().setCookies(cookies);
for (Cookie item in cookies) {
await web.CookieManager().setCookie(
url: web.WebUri(item.domain ?? ''),
name: item.name,
value: item.value,
path: item.path ?? '',
domain: item.domain,
isSecure: item.secure,
isHttpOnly: item.httpOnly,
);
}
} catch (e) {
SmartDialog.showToast('设置登录态失败,$e');
}
final result = await UserHttp.userInfo();
if (result['status'] && result['data'].isLogin) {
SmartDialog.showToast('登录成功,当前采用「'
'${GStorage.setting.get(SettingBoxKey.defaultRcmdType, defaultValue: 'app')}'
'端」推荐');
await GStorage.userInfo.put('userInfoCache', result['data']);
try {
Get.find<MineController>()
..isLogin.value = true
..queryUserInfo();
} catch (_) {}
try {
Get.find<HomeController>()
..isLogin.value = true
..userFace.value = result['data'].face;
} catch (_) {}
try {
Get.find<DynamicsController>()
..isLogin.value = true
..ownerMid = result['data'].mid
..face = result['data'].face
..onRefresh();
} catch (_) {}
for (int i = 0; i < tabsConfig.length; i++) {
try {
Get.find<DynamicsTabController>(tag: tabsConfig[i]['tag'])
.onRefresh();
} catch (_) {}
}
try {
Get.find<MediaController>()
..mid = result['data'].mid
..onRefresh();
} catch (_) {}
try {
Get.find<LiveController>()
..isLogin.value = true
..fetchLiveFollowing();
} catch (_) {}
} else {
// 获取用户信息失败
SmartDialog.showNotify(
msg: '登录失败请检查cookie是否正确${result['message']}',
notifyType: NotifyType.warning);
}
}
static bool isStringNumeric(str) { static bool isStringNumeric(str) {
RegExp numericRegex = RegExp(r'^[\d\.]+$'); RegExp numericRegex = RegExp(r'^[\d\.]+$');
return numericRegex.hasMatch(str.toString()); return numericRegex.hasMatch(str.toString());