优化 API Token 秘钥管理;修复服务器统一报错信息 BUG

This commit is contained in:
milimoe 2025-04-18 01:11:16 +08:00
parent 88dfe446e4
commit a412929a10
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
3 changed files with 28 additions and 30 deletions

View File

@ -105,8 +105,8 @@ void StartServer()
ServerHelper.WriteLine("请输入 help 来获取帮助,按下 Ctrl+C 关闭服务器。"); ServerHelper.WriteLine("请输入 help 来获取帮助,按下 Ctrl+C 关闭服务器。");
// 初始化用户密钥列表 // 初始化服务器其他配置文件
FunGameSystem.InitUserKeys(); FunGameSystem.InitOtherConfig();
ServerHelper.PrintFunGameTitle(); ServerHelper.PrintFunGameTitle();

View File

@ -46,6 +46,11 @@ namespace Milimoe.FunGame.Server.Services
/// <summary> /// <summary>
/// 服务器配置 /// 服务器配置
/// </summary> /// </summary>
public static PluginConfig LocalConfig { get; set; } = new("system", "local");
/// <summary>
/// 数据库配置
/// </summary>
public static PluginConfig SQLConfig { get; set; } = new("system", "sqlconfig"); public static PluginConfig SQLConfig { get; set; } = new("system", "sqlconfig");
/// <summary> /// <summary>
@ -53,6 +58,11 @@ namespace Milimoe.FunGame.Server.Services
/// </summary> /// </summary>
public const string FunGameWebAPITokenID = "fungame_web_api"; public const string FunGameWebAPITokenID = "fungame_web_api";
/// <summary>
/// API Secret 字段名
/// </summary>
public const string APISecretField = "api_secret";
/// <summary> /// <summary>
/// 初始化数据库连接器 /// 初始化数据库连接器
/// </summary> /// </summary>
@ -237,10 +247,12 @@ namespace Milimoe.FunGame.Server.Services
} }
/// <summary> /// <summary>
/// 初始化用户密钥列表 /// 初始化服务器其他配置文件
/// </summary> /// </summary>
public static void InitUserKeys() public static void InitOtherConfig()
{ {
LocalConfig.LoadConfig();
LocalConfig.SaveConfig();
UserKeys.LoadConfig(); UserKeys.LoadConfig();
UserKeys.SaveConfig(); UserKeys.SaveConfig();
} }
@ -279,6 +291,7 @@ namespace Milimoe.FunGame.Server.Services
using SQLHelper? sql = Factory.OpenFactory.GetSQLHelper(); using SQLHelper? sql = Factory.OpenFactory.GetSQLHelper();
if (sql != null) if (sql != null)
{ {
key = Encryption.HmacSha256(key, LocalConfig.Get<string>(APISecretField) ?? "");
sql.ExecuteDataSet(ApiTokens.Select_GetAPISecretKey(sql, key)); sql.ExecuteDataSet(ApiTokens.Select_GetAPISecretKey(sql, key));
if (sql.Result == SQLResult.Success) if (sql.Result == SQLResult.Success)
{ {
@ -288,51 +301,35 @@ namespace Milimoe.FunGame.Server.Services
return false; return false;
} }
/// <summary>
/// 获取 API Secret Key
/// </summary>
/// <param name="token"></param>
public static string GetAPISecretKey(string token)
{
using SQLHelper? sql = Factory.OpenFactory.GetSQLHelper();
if (sql != null)
{
sql.ExecuteDataSet(ApiTokens.Select_GetAPIToken(sql, token));
if (sql.Result == SQLResult.Success)
{
return sql.DataSet.Tables[0].Rows[0][ApiTokens.Column_SecretKey].ToString() ?? "";
}
}
return "";
}
/// <summary> /// <summary>
/// 设置 API Secret Key /// 设置 API Secret Key
/// </summary> /// </summary>
/// <param name="token"></param> /// <param name="token"></param>
/// <param name="reference1"></param> /// <param name="reference1"></param>
/// <param name="reference2"></param> /// <param name="reference2"></param>
public static void SetAPISecretKey(string token, string reference1 = "", string reference2 = "", SQLHelper? sqlHelper = null) public static string SetAPISecretKey(string token, string reference1 = "", string reference2 = "", SQLHelper? sqlHelper = null)
{ {
bool useSQLHelper = sqlHelper != null; bool useSQLHelper = sqlHelper != null;
sqlHelper ??= Factory.OpenFactory.GetSQLHelper(); sqlHelper ??= Factory.OpenFactory.GetSQLHelper();
string key = Encryption.GenerateRandomString(); string key = Encryption.GenerateRandomString();
string enKey = Encryption.HmacSha256(key, LocalConfig.Get<string>(APISecretField) ?? "");
if (sqlHelper != null) if (sqlHelper != null)
{ {
sqlHelper.ExecuteDataSet(ApiTokens.Select_GetAPIToken(sqlHelper, token)); sqlHelper.ExecuteDataSet(ApiTokens.Select_GetAPIToken(sqlHelper, token));
if (sqlHelper.Success) if (sqlHelper.Success)
{ {
sqlHelper.Execute(ApiTokens.Update_APIToken(sqlHelper, token, key, reference1, reference2)); sqlHelper.Execute(ApiTokens.Update_APIToken(sqlHelper, token, enKey, reference1, reference2));
} }
else else
{ {
sqlHelper.Execute(ApiTokens.Insert_APIToken(sqlHelper, token, key, reference1, reference2)); sqlHelper.Execute(ApiTokens.Insert_APIToken(sqlHelper, token, enKey, reference1, reference2));
} }
} }
if (!useSQLHelper) if (!useSQLHelper)
{ {
sqlHelper?.Dispose(); sqlHelper?.Dispose();
} }
return key;
} }
/// <summary> /// <summary>
@ -354,6 +351,7 @@ namespace Milimoe.FunGame.Server.Services
{ {
mysqlHelper.ExecuteSqlFile(AppDomain.CurrentDomain.BaseDirectory + "fungame.sql"); mysqlHelper.ExecuteSqlFile(AppDomain.CurrentDomain.BaseDirectory + "fungame.sql");
} }
LocalConfig.Add(APISecretField, Encryption.GenerateRandomString());
SetAPISecretKey(FunGameWebAPITokenID, sqlHelper: sqlHelper); SetAPISecretKey(FunGameWebAPITokenID, sqlHelper: sqlHelper);
sqlHelper.Execute(Configs.Insert_Config(sqlHelper, "Initialization", FunGameInfo.FunGame_Version, "SQL Service Installed.")); sqlHelper.Execute(Configs.Insert_Config(sqlHelper, "Initialization", FunGameInfo.FunGame_Version, "SQL Service Installed."));
SQLConfig.Clear(); SQLConfig.Clear();

View File

@ -62,8 +62,8 @@ try
// 读取 Server 插件 // 读取 Server 插件
FunGameSystem.GetServerPlugins(); FunGameSystem.GetServerPlugins();
// 初始化用户密钥列表 // 初始化服务器其他配置文件
FunGameSystem.InitUserKeys(); FunGameSystem.InitOtherConfig();
// Add services to the container. // Add services to the container.
WebApplicationBuilder builder = WebApplication.CreateBuilder(args); WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
@ -215,7 +215,7 @@ try
IExceptionHandlerFeature? contextFeature = context.Features.Get<IExceptionHandlerFeature>(); IExceptionHandlerFeature? contextFeature = context.Features.Get<IExceptionHandlerFeature>();
if (contextFeature != null) if (contextFeature != null)
{ {
await context.Response.WriteAsync(new PayloadModel<DataRequestType>() await context.Response.WriteAsync(NetworkUtility.JsonSerialize(new PayloadModel<DataRequestType>()
{ {
Event = "system_error", Event = "system_error",
RequestType = DataRequestType.UnKnown, RequestType = DataRequestType.UnKnown,
@ -223,9 +223,9 @@ try
Message = "Internal Server Error.", Message = "Internal Server Error.",
Data = new() Data = new()
{ {
{ "detail", contextFeature.Error.Message } { "msg", contextFeature.Error.Message }
} }
}.ToString() ?? ""); }));
} }
}); });
}); });