Beispiel #1
0
        public static LoginServerConfig GetInstance()
        {
            if (instance == null)
            {
                instance = new LoginServerConfig();
            }

            return(instance);
        }
        public async Task <CreateUserRes> CreateUserRequest(CreateUserReq reqPacket)
        {
            var resPacket = new CreateUserRes();

            //패킷으로부터 아이디와 비번을 알아낸다.
            //비번을 암호화 한후
            var encryptedPassword = Encrypter.EncryptString(reqPacket.UserPw);

            Console.WriteLine($"Create User : Id({reqPacket.UserId}), Pw({encryptedPassword})");


            //아이디와 비번을 데이터 베이스에 저장 이미 존재하는지는 DB 서버에서 확인한다.
            try
            {
                //패킷 생성
                var userJoinReq = new UserJoinInReq()
                {
                    UserId      = reqPacket.UserId,
                    EncryptedPw = encryptedPassword
                };

                var config = LoginServerConfig.GetInstance();

                var userJoinRes = await HttpSender.RequestHttp <UserJoinInReq, UserJoinInRes>
                                      (config.DBServerAddress, config.DBServerPort, "DB/AddUser", userJoinReq);

                //유저 생성이 완료되지 않았다면 에러
                if (userJoinRes.Result != (int)ErrorCode.None)
                {
                    Console.WriteLine($"User Create Fail : Error({userJoinRes.Result}), Id({reqPacket.UserId}), Pw({encryptedPassword})");
                    resPacket.Result = userJoinRes.Result;
                    return(resPacket);
                }

                //완료되면 완료 패킷

                Console.WriteLine($"User Create Success : Id({reqPacket.UserId}), Pw({encryptedPassword})");
                resPacket.Result = (int)ErrorCode.None;

                return(resPacket);
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error Occur at Create User Request. Message : {e.Message}");
                resPacket.Result = (int)ErrorCode.CreateUserRequestException;

                return(resPacket);
            }
        }
        static void Main(string[] args)
        {
            var config = LoginServerConfig.GetInstance();

            var addressBuilder = new StringBuilder(20);

            addressBuilder.AppendFormat("http://*:{0}/", config.LoginServerPort);

            var baseAddress = "http://localhost:18000/";

            using (WebApp.Start <Startup>(url: baseAddress))
            {
                Console.WriteLine($"Login server initialized. Base address : {baseAddress}");
                Console.ReadLine();
            }
        }
        public async Task <LoginRes> LoginRequest(LoginReq reqPacket)
        {
            var resPacket = new LoginRes();

            // 유저 패스워드 암호화.
            var encryptedPassword = Encrypter.EncryptString(reqPacket.UserPw);

            Console.WriteLine($"Login request : Id({reqPacket.UserId}), Pw({encryptedPassword})");

            try
            {
                // DB에 유저가 가입되어 있는지를 조사한다.
                var userValidationReq = new UserValidationReq()
                {
                    UserId      = reqPacket.UserId,
                    EncryptedPw = encryptedPassword
                };

                var config = LoginServerConfig.GetInstance();

                var userValidationRes = await HttpSender.RequestHttp <UserValidationReq, UserValidationRes>(
                    config.DBServerAddress, config.DBServerPort, "DB/UserValidation", userValidationReq);

                // 가입되어 있지 않다면 에러 반환.
                if (userValidationRes.Result != (int)ErrorCode.None)
                {
                    Console.WriteLine($"Invalid login request : Error({userValidationRes.Result}), Id({reqPacket.UserId}), Pw({encryptedPassword})");
                    resPacket.Result = userValidationRes.Result;
                    resPacket.Token  = -1;
                    return(resPacket);
                }

                // 가입되어있다면 토큰을 생성한다.
                resPacket.Token = TokenGenerator.GetInstance().CreateToken();

                // DB Server에 토큰을 등록한다.
                var registTokenReq = new RegistTokenReq()
                {
                    UserId = reqPacket.UserId,
                    Token  = resPacket.Token
                };

                var registTokenRes = await HttpSender.RequestHttp <RegistTokenReq, RegistTokenRes>(
                    config.DBServerAddress, config.DBServerPort, "DB/RegistToken", registTokenReq);

                // 토큰 등록이 실패했다면 에러 반환.
                if (registTokenRes.Result != (int)ErrorCode.None)
                {
                    Console.WriteLine($"Token regist failed : Error({registTokenRes.Result}), Id({reqPacket.UserId}), Pw({encryptedPassword})");
                    resPacket.Result = registTokenRes.Result;
                    resPacket.Token  = -1;
                    return(resPacket);
                }

                // 모든 절차가 완료되었다면 정상값 반환.
                Console.WriteLine($"Login request completed : Id({reqPacket.UserId}), Pw({encryptedPassword})");
                resPacket.Result = (int)ErrorCode.None;

#if DEBUG
                // TODO :: 이부분을 관리 서버와의 통신으로 받아오는 것으로 고쳐야 함.
                //우선 직접적으로 게임서버에 접속하도록 한다. 왜냐면 다들 취업을 해서 개발시간이 줄어 들었기 때문이다.
                resPacket.ManageServerAddr = "localhost";
                resPacket.ManageServerPort = 19000;
#endif

                return(resPacket);
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error invoked in login request. Message : {e.Message}");
                resPacket.Result = (int)ErrorCode.LoginRequestException;
                return(resPacket);
            }
        }