feat(telemetry): 接通心跳服务的 JWT 认证,启用实时在线统计

- 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 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-03-05 07:20:05 -08:00
parent 3aa2856770
commit 37b11a3db6
3 changed files with 28 additions and 10 deletions

View File

@ -778,9 +778,10 @@ class AccountService {
value: 'true', value: 'true',
); );
// ID使userSerialNumD25121400005 // ID和访问令牌
if (TelemetryService().isInitialized) { if (TelemetryService().isInitialized) {
TelemetryService().setUserId(response.userSerialNum); TelemetryService().setUserId(response.userSerialNum);
TelemetryService().setAccessToken(response.accessToken);
debugPrint('$_tag _saveAccountData() - 设置TelemetryService userId: ${response.userSerialNum}'); debugPrint('$_tag _saveAccountData() - 设置TelemetryService userId: ${response.userSerialNum}');
} }
@ -1166,9 +1167,10 @@ class AccountService {
value: 'true', value: 'true',
); );
// ID使userSerialNumD25121400005 // ID和访问令牌
if (TelemetryService().isInitialized) { if (TelemetryService().isInitialized) {
TelemetryService().setUserId(response.userSerialNum); TelemetryService().setUserId(response.userSerialNum);
TelemetryService().setAccessToken(response.accessToken);
debugPrint('$_tag _saveRecoverAccountData() - 设置TelemetryService userId: ${response.userSerialNum}'); debugPrint('$_tag _saveRecoverAccountData() - 设置TelemetryService userId: ${response.userSerialNum}');
} }
@ -1993,9 +1995,10 @@ class AccountService {
value: 'true', value: 'true',
); );
// ID // ID和访问令牌
if (TelemetryService().isInitialized) { if (TelemetryService().isInitialized) {
TelemetryService().setUserId(response.accountSequence); TelemetryService().setUserId(response.accountSequence);
TelemetryService().setAccessToken(response.accessToken);
debugPrint('$_tag _savePhoneAuthData() - 设置TelemetryService userId: ${response.accountSequence}'); debugPrint('$_tag _savePhoneAuthData() - 设置TelemetryService userId: ${response.accountSequence}');
} }

View File

@ -289,9 +289,11 @@ class MultiAccountService {
// 6. // 6.
await setCurrentAccountId(userSerialNum); await setCurrentAccountId(userSerialNum);
// 7. ID // 7. ID和访问令牌_restoreAccountData token SecureStorage
if (TelemetryService().isInitialized) { if (TelemetryService().isInitialized) {
TelemetryService().setUserId(userSerialNum); TelemetryService().setUserId(userSerialNum);
final restoredToken = await _secureStorage.read(key: StorageKeys.accessToken);
TelemetryService().setAccessToken(restoredToken);
debugPrint('$_tag switchToAccount() - 设置TelemetryService userId: $userSerialNum'); debugPrint('$_tag switchToAccount() - 设置TelemetryService userId: $userSerialNum');
} }
@ -479,6 +481,7 @@ class MultiAccountService {
// Sentry // Sentry
if (TelemetryService().isInitialized) { if (TelemetryService().isInitialized) {
TelemetryService().clearUserId(); TelemetryService().clearUserId();
TelemetryService().clearAccessToken();
} }
if (SentryService().isInitialized) { if (SentryService().isInitialized) {
SentryService().clearUser(); SentryService().clearUser();

View File

@ -36,6 +36,9 @@ class TelemetryService {
String? _userId; String? _userId;
String? get userId => _userId; String? get userId => _userId;
/// 访/
String? _accessToken;
/// API /// API
late String _apiBaseUrl; late String _apiBaseUrl;
@ -148,13 +151,11 @@ class TelemetryService {
debugPrint('📊 [Telemetry] Install ID: $_installId'); debugPrint('📊 [Telemetry] Install ID: $_installId');
} }
/// /// 使 access token AccountService
Map<String, String> _getAuthHeaders() { Map<String, String> _getAuthHeaders() {
// TODO: AuthService token if (_accessToken != null) {
// final token = AuthService.instance.accessToken; return {'Authorization': 'Bearer $_accessToken'};
// if (token != null) { }
// return {'Authorization': 'Bearer $token'};
// }
return {}; return {};
} }
@ -294,6 +295,17 @@ class TelemetryService {
debugPrint('📊 [Telemetry] User ID cleared'); debugPrint('📊 [Telemetry] User ID cleared');
} }
/// 访/
void setAccessToken(String? token) {
_accessToken = token;
debugPrint('📊 [Telemetry] Access token ${token != null ? 'set' : 'cleared'}');
}
/// 访退
void clearAccessToken() {
_accessToken = null;
}
/// 退 /// 退
/// ///
Future<void> pauseForLogout() async { Future<void> pauseForLogout() async {