From 37b11a3db6044889e6a09c1e4c2854f25b55b989 Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 5 Mar 2026 07:20:05 -0800 Subject: [PATCH] =?UTF-8?q?feat(telemetry):=20=E6=8E=A5=E9=80=9A=E5=BF=83?= =?UTF-8?q?=E8=B7=B3=E6=9C=8D=E5=8A=A1=E7=9A=84=20JWT=20=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=EF=BC=8C=E5=90=AF=E7=94=A8=E5=AE=9E=E6=97=B6=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TelemetryService: 添加 _accessToken 缓存字段,实现 setAccessToken/clearAccessToken - _getAuthHeaders(): 返回 Bearer token(原为空 {},导致心跳 401) - AccountService: 3 处登录成功后同步调用 setAccessToken(response.accessToken) - MultiAccountService: 账号切换后从 SecureStorage 读取恢复的 token 并注入; 账号删除时同步调用 clearAccessToken() presence-service 后端待部署后,心跳将开始正常工作,实时在线数和 DAU 数据可用。 Co-Authored-By: Claude Sonnet 4.6 --- .../lib/core/services/account_service.dart | 9 ++++--- .../core/services/multi_account_service.dart | 5 +++- .../lib/core/telemetry/telemetry_service.dart | 24 ++++++++++++++----- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/frontend/mobile-app/lib/core/services/account_service.dart b/frontend/mobile-app/lib/core/services/account_service.dart index fbbd4115..550ae34f 100644 --- a/frontend/mobile-app/lib/core/services/account_service.dart +++ b/frontend/mobile-app/lib/core/services/account_service.dart @@ -778,9 +778,10 @@ class AccountService { value: 'true', ); - // 设置遥测服务的用户ID(使用userSerialNum,如D25121400005) + // 设置遥测服务的用户ID和访问令牌(用于心跳认证) if (TelemetryService().isInitialized) { TelemetryService().setUserId(response.userSerialNum); + TelemetryService().setAccessToken(response.accessToken); debugPrint('$_tag _saveAccountData() - 设置TelemetryService userId: ${response.userSerialNum}'); } @@ -1166,9 +1167,10 @@ class AccountService { value: 'true', ); - // 设置遥测服务的用户ID(使用userSerialNum,如D25121400005) + // 设置遥测服务的用户ID和访问令牌(用于心跳认证) if (TelemetryService().isInitialized) { TelemetryService().setUserId(response.userSerialNum); + TelemetryService().setAccessToken(response.accessToken); debugPrint('$_tag _saveRecoverAccountData() - 设置TelemetryService userId: ${response.userSerialNum}'); } @@ -1993,9 +1995,10 @@ class AccountService { value: 'true', ); - // 设置遥测服务的用户ID + // 设置遥测服务的用户ID和访问令牌(用于心跳认证) if (TelemetryService().isInitialized) { TelemetryService().setUserId(response.accountSequence); + TelemetryService().setAccessToken(response.accessToken); debugPrint('$_tag _savePhoneAuthData() - 设置TelemetryService userId: ${response.accountSequence}'); } diff --git a/frontend/mobile-app/lib/core/services/multi_account_service.dart b/frontend/mobile-app/lib/core/services/multi_account_service.dart index c0eada42..ac7eafd6 100644 --- a/frontend/mobile-app/lib/core/services/multi_account_service.dart +++ b/frontend/mobile-app/lib/core/services/multi_account_service.dart @@ -289,9 +289,11 @@ class MultiAccountService { // 6. 设置当前账号标记 await setCurrentAccountId(userSerialNum); - // 7. 更新遥测服务的用户ID + // 7. 更新遥测服务的用户ID和访问令牌(_restoreAccountData 已将 token 写入 SecureStorage) if (TelemetryService().isInitialized) { TelemetryService().setUserId(userSerialNum); + final restoredToken = await _secureStorage.read(key: StorageKeys.accessToken); + TelemetryService().setAccessToken(restoredToken); debugPrint('$_tag switchToAccount() - 设置TelemetryService userId: $userSerialNum'); } @@ -479,6 +481,7 @@ class MultiAccountService { // 清除遥测和 Sentry 用户信息 if (TelemetryService().isInitialized) { TelemetryService().clearUserId(); + TelemetryService().clearAccessToken(); } if (SentryService().isInitialized) { SentryService().clearUser(); diff --git a/frontend/mobile-app/lib/core/telemetry/telemetry_service.dart b/frontend/mobile-app/lib/core/telemetry/telemetry_service.dart index 419c0a39..4da6a272 100644 --- a/frontend/mobile-app/lib/core/telemetry/telemetry_service.dart +++ b/frontend/mobile-app/lib/core/telemetry/telemetry_service.dart @@ -36,6 +36,9 @@ class TelemetryService { String? _userId; String? get userId => _userId; + /// 访问令牌(登录后缓存,用于心跳/上传认证头) + String? _accessToken; + /// API 基础地址 late String _apiBaseUrl; @@ -148,13 +151,11 @@ class TelemetryService { debugPrint('📊 [Telemetry] Install ID: $_installId'); } - /// 获取认证头 + /// 获取认证头(使用缓存的 access token,由 AccountService 登录时注入) Map _getAuthHeaders() { - // TODO: 从 AuthService 获取 token - // final token = AuthService.instance.accessToken; - // if (token != null) { - // return {'Authorization': 'Bearer $token'}; - // } + if (_accessToken != null) { + return {'Authorization': 'Bearer $_accessToken'}; + } return {}; } @@ -294,6 +295,17 @@ class TelemetryService { debugPrint('📊 [Telemetry] User ID cleared'); } + /// 设置访问令牌(登录/切换账号后调用,用于心跳认证) + void setAccessToken(String? token) { + _accessToken = token; + debugPrint('📊 [Telemetry] Access token ${token != null ? 'set' : 'cleared'}'); + } + + /// 清除访问令牌(退出登录时调用) + void clearAccessToken() { + _accessToken = null; + } + /// 暂停遥测上传(退出登录时调用) /// 停止定期上传任务,清空事件队列 Future pauseForLogout() async {