public static string GetGoogleId(string authToken, AuthTokenRepository authTokenRepository, UserRepository userRepository)
        {
            if (string.IsNullOrEmpty(authToken))
            {
                throw new ArgumentNullException("authToken");
            }

            User user;
            var googleId = authTokenRepository.GetGoogleIdByAuthToken(authToken);
            if (googleId == null)
            {
                user = RecordTheAuthTokenInTheDatabase(authToken, authTokenRepository);
                googleId = user.GoogleId;
            }
            else
            {
                user = userRepository.GetUserByGoogleId(googleId);
                if (user == null)
                {
                    var googlePlusLoginDto = GetGooglePlusLoginDto(authToken);
                    if (googlePlusLoginDto == null || String.IsNullOrEmpty(googlePlusLoginDto.id))
                    {
                        throw new ArgumentException(String.Format("Unable to retrieve a Google user for auth token: '{0}'.", authToken));
                    }

                    user = Mapper.Map<GooglePlusLoginDto, User>(googlePlusLoginDto);
                }
            }
            AddOrUpdateTheUser(user, userRepository);
            return googleId;
        }
Beispiel #2
0
 /// <inheritdoc />
 protected override async void OnEventFired(object source, EventArgs args)
 {
     //TODO: Check result
     //We don't need to be on the main thread to send a session claim request.
     await SendService.SendMessage(new ClientSessionClaimRequestPayload(AuthTokenRepository.RetrieveWithType(), CharacterDataRepository.CharacterId))
     .ConfigureAwait(false);
 }
Beispiel #3
0
        public async Task <RES_LOGIN> Process(REQ_LOGIN requestPacket)
        {
            var responseResult = new RES_LOGIN();

            var userObject = await UserRepository.GetUser(requestPacket.UserID);

            if (userObject == null)
            {
                return(responseResult.Return(ERROR_CODE.REQ_LOGIN_INVALID_USER));
            }

            if (userObject.PW != requestPacket.PW)
            {
                return(responseResult.Return(ERROR_CODE.REQ_LOGIN_PW));
            }
            //시간은 좋지 않다. https://paragonie.com/blog/2016/05/how-generate-secure-random-numbers-in-various-programming-languages

            var authToken = System.DateTime.Now.Ticks.ToString();
            //레디스에 등록하기 전에 확인을 해보거나
            await AuthTokenRepository.Add(requestPacket.UserID, authToken);

            responseResult.SetResult(ERROR_CODE.NONE);
            responseResult.AuthToken = authToken;
            return(responseResult);
        }
Beispiel #4
0
        public UnitOfWork()
        {
            _appDbContext = new AppDbContext();

            Accounts = new AccountsRepository(_appDbContext);
            EmailVerificationTokens = new EmailVerificationTokenRepository(_appDbContext);
            AuthTokens = new AuthTokenRepository(_appDbContext);
        }
Beispiel #5
0
        protected override void OnEventFired(object source, EventArgs args)
        {
            //Once connection to the instance server is established
            //we must attempt to claim out session on to actually fully enter.

            //We send time sync first since we need to have a good grasp of the current network time before
            //we even spawn into the world and start recieveing the world states.
            SendService.SendMessageImmediately(new ServerTimeSyncronizationRequestPayload(DateTime.UtcNow.Ticks))
            .ConfigureAwaitFalse();

            //TODO: When it comes to community servers, we should not expose the sensitive JWT to them. We need a better way to deal with auth against untrusted instance servers
            SendService.SendMessage(new ClientSessionClaimRequestPayload(AuthTokenRepository.RetrieveWithType(), CharacterDataRepository.CharacterId));
        }
 public AccountService(RequestContext c,
     UserAccountRepository userAccounts,
     AuthTokenRepository authTokens,
     ApiKeyRepository apiKeys,
     StoreUserRelationshipRepository adminUsersXStores,
     StoreRepository stores)
 {
     context = c;
     AdminUsers = userAccounts;
     AuthTokens = authTokens;
     ApiKeys = apiKeys;
     AdminUsersXStores = adminUsersXStores;
     Stores = stores;
 }
Beispiel #7
0
        public async Task <RES_LOGOUT> Process(REQ_LOGOUT requestPacket)
        {
            var responseResult = new RES_LOGOUT();

            var userObject = await AuthTokenRepository.Check(requestPacket.UserID, requestPacket.AuthToken);

            if (userObject == false)
            {
                return(responseResult.Return(ERROR_CODE.REQ_LOGOUT_FAIL_CHECK_ID_OR_AUTHTOKEN));
            }

            await AuthTokenRepository.Delete(requestPacket.UserID);

            responseResult.SetResult(ERROR_CODE.NONE);
            return(responseResult);
        }
        public UnitOfWork()
        {
            _appDbContext = new AppDbContext();

            var accounts = new AccountsRepository(_appDbContext);

            _repositories.Add(accounts);
            Accounts = accounts;

            var emailVerificationTokens = new EmailVerificationTokenRepository(_appDbContext);

            _repositories.Add(emailVerificationTokens);
            EmailVerificationTokens = emailVerificationTokens;

            var authTokens = new AuthTokenRepository(_appDbContext);

            _repositories.Add(authTokens);
            AuthTokens = authTokens;
        }
        public async Task <RES_LOGIN> Process(REQ_LOGIN requestPacket)
        {
            var responseResult = new RES_LOGIN();

            var userObject = await UserRepository.GetUser(requestPacket.UserID);

            if (userObject == null)
            {
                return(responseResult.Return(ERROR_CODE.REQ_LOGIN_INVALID_USER));
            }

            if (userObject.PW != requestPacket.PW)
            {
                return(responseResult.Return(ERROR_CODE.REQ_LOGIN_PW));
            }

            var authToken = System.DateTime.Now.Ticks.ToString();
            await AuthTokenRepository.Add(requestPacket.UserID, authToken);

            responseResult.SetResult(ERROR_CODE.NONE);
            responseResult.AuthToken = authToken;
            return(responseResult);
        }
Beispiel #10
0
        //TODO: Race condition here because it's possible the subsciber hasn't subscribed just yet.
        /// <inheritdoc />
        public async Task OnGameInitialized()
        {
            CharacterListResponse listResponse = await CharacterQueryable.GetCharacters(AuthTokenRepository.RetrieveWithType())
                                                 .ConfigureAwait(true);

            if (!listResponse.isSuccessful || listResponse.CharacterIds.Count == 0)
            {
                if (Logger.IsErrorEnabled)
                {
                    Logger.Error($"Failed to query character list. Recieved ResultCode: {listResponse.ResultCode}");
                }

                //We don't have character creation... Soooo, nothing we can do right now.
                return;
            }

            //TODO: Should we make this API spit out network guids?
            foreach (var characterId in listResponse.CharacterIds)
            {
                NetworkEntityGuid entityGuid = new NetworkEntityGuidBuilder()
                                               .WithType(EntityType.Player)
                                               .WithId(characterId)
                                               .Build();

                OnCharacterSelectionEntryChanged?.Invoke(this, new CharacterSelectionEntryDataChangeEventArgs(entityGuid));
            }
        }
        private static User RecordTheAuthTokenInTheDatabase(string authToken, AuthTokenRepository authTokenRepository)
        {
            var googlePlusLoginDto = GetGooglePlusLoginDto(authToken);
            if (googlePlusLoginDto == null || String.IsNullOrEmpty(googlePlusLoginDto.id))
            {
                throw new ArgumentException(String.Format("Unable to retrieve a Google user for auth token: '{0}'.", authToken));
            }

            var mappedUser = Mapper.Map<GooglePlusLoginDto, User>(googlePlusLoginDto);
            authTokenRepository.Add(new AuthToken
            {
                Token = authToken,
                GoogleId = mappedUser.GoogleId,
                CreateDate = DateTimeOffset.Now
            });
            return mappedUser;
        }
        protected override void OnEventFired(object source, EventArgs args)
        {
            //Once connection to the instance server is established
            //we must attempt to claim out session on to actually fully enter.
            EventQueueable.Enqueue(async() =>
            {
                try
                {
                    CharacterListResponse listResponse = await CharacterService.GetCharacters();

                    await CharacterService.TryEnterSession(listResponse.CharacterIds.First());

                    CharacterDataRepository.UpdateCharacterId(listResponse.CharacterIds.First());

                    //TODO: When it comes to community servers, we should not expose the sensitive JWT to them. We need a better way to deal with auth against untrusted instance servers
                    await SendService.SendMessage(new ClientSessionClaimRequestPayload(AuthTokenRepository.RetrieveWithType(), listResponse.CharacterIds.First()));
                }
                catch (Exception e)
                {
                    if (Logger.IsErrorEnabled)
                    {
                        Logger.Error($"Failed to authenticate to instance server as character. Reason: {e.ToString()}");
                    }

                    throw;
                }
            });
        }