feat : 토큰 인증 RestApi 구현 / Token기반 haskKey구현 / Dummy, User Token체크 분기
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
using LiteNetLib;
|
||||
using LiteNetLib.Utils;
|
||||
using MMOserver.Api;
|
||||
using MMOserver.Game.Channel;
|
||||
using MMOserver.Packet;
|
||||
using MMOserver.Utils;
|
||||
using ProtoBuf;
|
||||
using Serilog;
|
||||
using ServerLib.Packet;
|
||||
@@ -44,9 +46,9 @@ public class GameServer : ServerBase
|
||||
SendTo(peer, payload, DeliveryMethod.ReliableUnordered);
|
||||
}
|
||||
|
||||
protected override void HandleAuth(NetPeer peer, byte[] payload)
|
||||
protected override void HandleAuthDummy(NetPeer peer, byte[] payload)
|
||||
{
|
||||
AccTokenPacket accTokenPacket = Serializer.Deserialize<AccTokenPacket>(new ReadOnlyMemory<byte>(payload));
|
||||
DummyAccTokenPacket accTokenPacket = Serializer.Deserialize<DummyAccTokenPacket>(new ReadOnlyMemory<byte>(payload));
|
||||
long hashKey = accTokenPacket.Token;
|
||||
|
||||
if (sessions.TryGetValue(hashKey, out NetPeer? existing))
|
||||
@@ -68,6 +70,56 @@ public class GameServer : ServerBase
|
||||
ChannelManager cm = ChannelManager.Instance;
|
||||
cm.AddUser(1, hashKey, new Player());
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Error("[Server] Dummy 클라이언트가 아닙니다. 연결을 종료합니다. HashKey={Key} PeerId={Id}", hashKey, peer.Id);
|
||||
peer.Disconnect();
|
||||
return;
|
||||
}
|
||||
|
||||
Log.Information("[Server] 인증 완료 HashKey={Key} PeerId={Id}", hashKey, peer.Id);
|
||||
OnSessionConnected(peer, hashKey);
|
||||
}
|
||||
|
||||
protected override async void HandleAuth(NetPeer peer, byte[] payload)
|
||||
{
|
||||
AccTokenPacket accTokenPacket = Serializer.Deserialize<AccTokenPacket>(new ReadOnlyMemory<byte>(payload));
|
||||
string token = accTokenPacket.Token;
|
||||
long hashKey = UuidGeneratorManager.Instance.GetOrCreate(token);
|
||||
|
||||
if (sessions.TryGetValue(hashKey, out NetPeer? existing))
|
||||
{
|
||||
// WiFi → LTE 전환 등 재연결: 이전 피어 교체 (토큰 재검증 불필요)
|
||||
existing.Tag = null;
|
||||
sessions.Remove(hashKey);
|
||||
Log.Information("[Server] 재연결 HashKey={Key} Old={Old} New={New}", hashKey, existing.Id, peer.Id);
|
||||
existing.Disconnect();
|
||||
}
|
||||
else
|
||||
{
|
||||
// 신규 연결: 웹서버에 JWT 검증 요청
|
||||
string? username = await RestApi.Instance.VerifyTokenAsync(token);
|
||||
if (username == null)
|
||||
{
|
||||
Log.Warning("[Server] 토큰 검증 실패 - 연결 거부 PeerId={Id}", peer.Id);
|
||||
peer.Disconnect();
|
||||
return;
|
||||
}
|
||||
|
||||
Log.Information("[Server] 토큰 검증 성공 Username={Username} PeerId={Id}", username, peer.Id);
|
||||
}
|
||||
|
||||
peer.Tag = new Session(hashKey, peer);
|
||||
sessions[hashKey] = peer;
|
||||
pendingPeers.Remove(peer.Id);
|
||||
|
||||
if (hashKey <= 1000)
|
||||
{
|
||||
// 더미 클라이언트면 에러
|
||||
Log.Error("[Server] Dummy 클라이언트가 입니다. 연결을 종료합니다. HashKey={Key} PeerId={Id}", hashKey, peer.Id);
|
||||
peer.Disconnect();
|
||||
return;
|
||||
}
|
||||
|
||||
Log.Information("[Server] 인증 완료 HashKey={Key} PeerId={Id}", hashKey, peer.Id);
|
||||
OnSessionConnected(peer, hashKey);
|
||||
|
||||
Reference in New Issue
Block a user