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:
parent
3aa2856770
commit
37b11a3db6
|
|
@ -778,9 +778,10 @@ class AccountService {
|
||||||
value: 'true',
|
value: 'true',
|
||||||
);
|
);
|
||||||
|
|
||||||
// 设置遥测服务的用户ID(使用userSerialNum,如D25121400005)
|
// 设置遥测服务的用户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(使用userSerialNum,如D25121400005)
|
// 设置遥测服务的用户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}');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue