public async override void HandleAsync(long conv, MessagePacket packet) { Utility.Debug.LogInfo($"TokenHandler Conv:{conv}尝试Token"); MessagePacket handlerPacket = CosmosEntry.ReferencePoolManager.Spawn <MessagePacket>(); handlerPacket.OperationCode = (byte)GateOperationCode._Token; var packetMsg = packet.Messages; if (packetMsg == null) { return; } Dictionary <byte, object> messageDict = new Dictionary <byte, object>(); handlerPacket.Messages = messageDict; messageDict.Clear(); object data; var result = packetMsg.TryGetValue((byte)GateParameterCode.Token, out data); if (result) { string dataStr = null; try { dataStr = JWTEncoder.DecodeToken(data.ToString()); } catch (Exception) { Utility.Debug.LogError($"Conv:{conv} token 解码失败"); } //解码token if (string.IsNullOrEmpty(dataStr)) { handlerPacket.ReturnCode = (short)GateReturnCode.Fail; Utility.Debug.LogWarning($"Conv:{conv} {(GateReturnCode)handlerPacket.ReturnCode}"); return; } //反序列化为数据对象 var userInfoObj = Utility.Json.ToObject <UserInfo>(dataStr); Utility.Debug.LogInfo($"TokenHandler Conv:{conv} UserInfo:{userInfoObj}"); //组合键值 var tokenKey = userInfoObj.Account + ApplicationBuilder._TokenPostfix; //获取对应键值的key var tokenContext = RedisHelper.String.StringGet(tokenKey); if (string.IsNullOrEmpty(tokenContext)) { handlerPacket.ReturnCode = (byte)GateReturnCode.Empty; } else { if (data.ToString() == tokenContext) { handlerPacket.ReturnCode = (byte)GateReturnCode.Success; { //添加服务器列表数据; string dat; var hasDat = ApplicationBuilder.TryGetServerList(out dat); if (hasDat) { messageDict.TryAdd((byte)GateParameterCode.ServerInfo, dat); } } { TokenExpireData dat; var hasDat = ServerEntry.DataManager.TryGetValue(out dat); //更新过期时间; if (!hasDat) //没数据则默认一周; { RedisHelper.KeyExpire(data.ToString(), new TimeSpan(7, 0, 0, 0)); } else { //有数据则使用数据周期; var srcDat = dat as TokenExpireData; RedisHelper.KeyExpire(data.ToString(), new TimeSpan(srcDat.Days, srcDat.Hours, srcDat.Minutes, srcDat.Seconds)); } } NHCriteria nHCriteriaAccount = CosmosEntry.ReferencePoolManager.Spawn <NHCriteria>().SetValue("Account", userInfoObj.Account); NHCriteria nHCriteriaPassword = CosmosEntry.ReferencePoolManager.Spawn <NHCriteria>().SetValue("Password", userInfoObj.Password); var userObj = NHibernateQuerier.CriteriaSelect <User>(nHCriteriaAccount, nHCriteriaPassword); messageDict.TryAdd((byte)GateParameterCode.User, Utility.Json.ToJson(userObj)); CosmosEntry.ReferencePoolManager.Despawns(nHCriteriaAccount, nHCriteriaPassword); Utility.Debug.LogInfo($"Conv:{conv} Token decoded message success {userObj}"); } else { //验证失败,返回fail handlerPacket.ReturnCode = (byte)GateReturnCode.ItemNotFound; } } } else { //业务数据无效 handlerPacket.ReturnCode = (byte)GateReturnCode.InvalidOperationParameter; } //ServerEntry.NetMessageManager.SendMessageAsync(conv, handlerPacket); }
public async override void HandleAsync(long conv, MessagePacket packet) { Utility.Debug.LogInfo($"LoginHandler Conv:{conv}尝试登陆"); MessagePacket handlerPacket = CosmosEntry.ReferencePoolManager.Spawn <MessagePacket>(); handlerPacket.OperationCode = (byte)GateOperationCode._Login; var packetMsg = packet.Messages; if (packetMsg == null) { return; } Dictionary <byte, object> messageDict = new Dictionary <byte, object>(); handlerPacket.Messages = messageDict; messageDict.Clear(); object data; var result = packetMsg.TryGetValue((byte)GateParameterCode.UserInfo, out data); if (result) { var userInfoObj = Utility.Json.ToObject <UserInfo>(Convert.ToString(data)); Utility.Debug.LogInfo($"LoginHandler Conv:{conv} UserInfo:{userInfoObj}"); NHCriteria nHCriteriaAccount = CosmosEntry.ReferencePoolManager.Spawn <NHCriteria>().SetValue("Account", userInfoObj.Account); NHCriteria nHCriteriaPassword = CosmosEntry.ReferencePoolManager.Spawn <NHCriteria>().SetValue("Password", userInfoObj.Password); var userObj = NHibernateQuerier.CriteriaSelect <User>(nHCriteriaAccount, nHCriteriaPassword); var verified = (userObj != null); if (!verified) { //验证失败则返回空 handlerPacket.ReturnCode = (byte)GateReturnCode.ItemNotFound; Utility.Debug.LogWarning($"LoginHandler Conv:{conv}登陆失败,账号无效!"); } else { var token = JWTEncoder.EncodeToken(userInfoObj); //获取对应键值的key var tokenKey = userInfoObj.Account + ApplicationBuilder._TokenPostfix; { TokenExpireData dat; var hasDat = ServerEntry.DataManager.TryGetValue(out dat); //更新过期时间; if (!hasDat)//没数据则默认一周; { var t = RedisHelper.String.StringSet(tokenKey, token, new TimeSpan(7, 0, 0, 0)); } else { //有数据则使用数据周期; var srcDat = dat as TokenExpireData; var t = RedisHelper.String.StringSet(tokenKey, token, new TimeSpan(srcDat.Days, srcDat.Hours, srcDat.Minutes, srcDat.Seconds)); } } messageDict.TryAdd((byte)GateParameterCode.Token, token); { string dat; var hasDat = ApplicationBuilder.TryGetServerList(out dat); if (hasDat) { messageDict.TryAdd((byte)GateParameterCode.ServerInfo, dat); } } messageDict.TryAdd((byte)GateParameterCode.User, Utility.Json.ToJson(userObj)); handlerPacket.ReturnCode = (byte)GateReturnCode.Success; Utility.Debug.LogInfo($"Conv{conv} : {userInfoObj}"); CosmosEntry.ReferencePoolManager.Despawns(nHCriteriaAccount, nHCriteriaPassword); } } else { //业务数据无效 handlerPacket.ReturnCode = (byte)GateReturnCode.InvalidOperationParameter; } //ServerEntry.NetMessageManager.SendMessageAsync(conv, handlerPacket); }