This commit is contained in:
2026-06-15 18:18:16 +08:00
parent 97c9fba14e
commit 2b9f134e5f
4164 changed files with 386922 additions and 79 deletions

View File

@@ -14,7 +14,9 @@
"GUID:ff2731b992f0b4736afeff3719a96ad4",
"GUID:7a400ff9720ed4ff3ab2d2ef3c6b8a86",
"GUID:d9925423e828d479c9063ea882f31e06",
"GUID:cfcd2ce455f8d1944942cdd919ecaa60"
"GUID:cfcd2ce455f8d1944942cdd919ecaa60",
"GUID:9069ac25d95ca17448b247f3bb1c769f",
"GUID:9069ac25d95ca17448a247f3bb1c769f"
],
"includePlatforms": [],
"excludePlatforms": [],

View File

@@ -87,7 +87,7 @@ namespace IchniOnline.Online.Logic
try
{
var result = await IchniOnlineApiClient.Instance.PostAsync<LoginResponseDto>("/api/auth/third-party/login", dto);
Debug.Log(JsonUtility.ToJson(result.Data));
IsLoggingIn = false;
if (result.IsSuccess)

View File

@@ -1,4 +1,5 @@
using IchniOnline.Online.Models;
using IchniOnline.Online.Network.Models;
using TapSDK.Login;
using UnityEngine;
@@ -15,15 +16,7 @@ namespace IchniOnline.Online.Logic
/// <summary>
/// 本地是否存在有效的登录缓存
/// </summary>
public static bool HasCachedLogin
{
get
{
if (!ES3.KeyExists(ES3_KEY)) return false;
var data = ES3.Load<LoginCacheData>(ES3_KEY);
return data != null && data.IsValid;
}
}
public static bool HasCachedLogin => HasValidSession;
/// <summary>
/// 获取缓存的登录数据,无缓存返回 null
@@ -38,7 +31,17 @@ namespace IchniOnline.Online.Logic
}
/// <summary>
/// 将 TapTap 登录结果写入本地缓存
/// 缓存的 JWT 令牌,无缓存或无会话返回 null
/// </summary>
public static string CachedJwtToken => CachedData?.jwtToken;
/// <summary>
/// 是否存在有效的服务端会话JWT 令牌存在且 hasServerSession 为 true
/// </summary>
public static bool HasValidSession => CachedData?.IsValid ?? false;
/// <summary>
/// 将 TapTap 登录结果写入本地缓存,保留已有的服务端会话数据
/// </summary>
public static void SaveFromTapTapAccount(TapTapAccount account)
{
@@ -48,18 +51,68 @@ namespace IchniOnline.Online.Logic
return;
}
var data = new LoginCacheData(
account.openId,
account.unionId,
account.name,
account.avatar,
account.email
);
LoginCacheData data;
if (ES3.KeyExists(ES3_KEY))
{
data = ES3.Load<LoginCacheData>(ES3_KEY) ?? new LoginCacheData();
}
else
{
data = new LoginCacheData();
}
data.openId = account.openId;
data.unionId = account.unionId;
data.name = account.name;
data.avatar = account.avatar;
data.email = account.email;
ES3.Save(ES3_KEY, data);
Debug.Log($"[LoginCacheManager] 已缓存登录数据openId={data.openId}");
}
/// <summary>
/// 保存服务端认证会话JWT + 用户信息),保留已有的 TapTap 数据
/// </summary>
public static void SaveAuthSession(string jwtToken, LoginResponseDto response)
{
if (string.IsNullOrEmpty(jwtToken) || response == null)
{
Debug.LogWarning("[LoginCacheManager] jwtToken 或 response 为 null跳过缓存");
return;
}
LoginCacheData data;
if (ES3.KeyExists(ES3_KEY))
{
data = ES3.Load<LoginCacheData>(ES3_KEY) ?? new LoginCacheData();
}
else
{
data = new LoginCacheData();
}
data.UpdateFromServerResponse(response);
ES3.Save(ES3_KEY, data);
Debug.Log($"[LoginCacheManager] 已缓存服务端会话userId={data.userId}");
}
/// <summary>
/// 清除服务端会话数据,保留 TapTap 原始数据
/// </summary>
public static void ClearSession()
{
if (!ES3.KeyExists(ES3_KEY)) return;
var data = ES3.Load<LoginCacheData>(ES3_KEY);
if (data == null) return;
data.ClearServerSession();
ES3.Save(ES3_KEY, data);
Debug.Log("[LoginCacheManager] 已清除服务端会话,保留 TapTap 数据");
}
/// <summary>
/// 写入模拟数据(供编辑器工具使用)
/// </summary>

View File

@@ -27,6 +27,12 @@ namespace IchniOnline.Online.Logic
/// </summary>
public event Action<string> OnLoginFailed;
/// <summary>
/// TapTap 登录成功并获取 AccessToken 后触发,参数为 TapTapAccount 和 AccessToken。
/// AuthService 可订阅此事件在通用成功流程之前拦截 token 进行 API 调用。
/// </summary>
public event Action<TapTapAccount, AccessToken> OnLoginWithToken;
private bool _initialized;
private void Awake()
@@ -60,8 +66,10 @@ namespace IchniOnline.Online.Logic
enableLog = true
};
// TapSDK 初始化
TapTapSDK.Init(coreOptions);
_initialized = true;
}
/// <summary>
@@ -87,6 +95,7 @@ namespace IchniOnline.Online.Logic
// 发起 Tap 登录
var account = await TapTapLogin.Instance.LoginWithScopes(scopes.ToArray());
Debug.Log($"TapTap 登录成功,用户 ID{account.openId}name{account.name}");
OnLoginWithToken?.Invoke(account, account.accessToken);
LoginCacheManager.SaveFromTapTapAccount(account);
OnLoginSuccess?.Invoke(account);
}

View File

@@ -1,5 +1,6 @@
using System;
using UnityEngine;
using IchniOnline.Online.Network.Models;
namespace IchniOnline.Online.Models
{
@@ -16,6 +17,14 @@ namespace IchniOnline.Online.Models
public string email;
public long cacheTimestamp;
// Server session fields
public string jwtToken;
public string userId;
public string displayName;
public string avatarUrl;
public int permission;
public bool hasServerSession;
public LoginCacheData() { }
public LoginCacheData(string openId, string unionId, string name, string avatar, string email)
@@ -28,6 +37,26 @@ namespace IchniOnline.Online.Models
this.cacheTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
}
public bool IsValid => !string.IsNullOrEmpty(openId);
public bool IsValid => hasServerSession && !string.IsNullOrEmpty(jwtToken);
public void UpdateFromServerResponse(LoginResponseDto response)
{
this.jwtToken = response.Token;
this.userId = response.User.UserId;
this.displayName = response.User.DisplayName;
this.avatarUrl = response.User.AvatarUrl;
this.permission = response.User.Permission;
this.hasServerSession = true;
}
public void ClearServerSession()
{
this.jwtToken = null;
this.userId = null;
this.displayName = null;
this.avatarUrl = null;
this.permission = 0;
this.hasServerSession = false;
}
}
}

View File

@@ -17,7 +17,7 @@ namespace IchniOnline.Online.Network
private static IchniOnlineApiClient _instance;
public static IchniOnlineApiClient Instance => _instance ??= new IchniOnlineApiClient();
public string BaseUrl { get; set; } = "http://localhost:5433";
public string BaseUrl { get; set; } = "http://localhost:53734";
public string JwtToken { get; set; }
private IchniOnlineApiClient() { }

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 907170849dc345b29c0f7d072e1ca5db
timeCreated: 1781501503