Exemple #1
0
        public AccessRefreshToken(User user)
        {
            AccessToken = new JWT(user);

            using (var _db = new BelTwitContext(Helper.BelTwitDbOptions))
            {
                //еслі больше 5 токенов, то удаляем (безопасность!)
                var userRefreshTokens = _db.RefreshTokens.
                                        Where(p => p.UserId == user.Id)
                                        .ToList();
                if (userRefreshTokens.Count > 5)
                {
                    _db.RefreshTokens.RemoveRange(userRefreshTokens);
                }



                RefreshToken = new RefreshToken
                {
                    TokenValue = new Guid(),
                    ExpiresAt  = DateTime.Now.AddDays(60), //AddSeconds(20) - for testing
                    UserId     = user.Id
                };
                _db.RefreshTokens.Add(RefreshToken);
                _db.SaveChanges();
            }
        }
Exemple #2
0
        public void UpdateTokens()
        {
            //подгружается User от нужного Refresh (нужно для обновленія токенов)
            //лібо для удаления из БД при expire Refresh-а
            using (var _db = new BelTwitContext(Helper.BelTwitDbOptions))
            {
                var refreshFromDb = _db.RefreshTokens.
                                    FirstOrDefault(p => p.TokenValue == RefreshToken.TokenValue);
                if (refreshFromDb == null)
                {
                    throw new Exception("Refresh token doesn't exist in database anymore");
                }
                RefreshToken = refreshFromDb;

                _db.Entry(RefreshToken).Reference(p => p.User).Load();
                if (RefreshToken.User == null)
                {
                    throw new Exception("User of this token doesn't exist in database anymore");
                }
            }


            if (RefreshToken.ExpiresAt < DateTime.Now)
            {
                //удаляем із бд его
                using (var _db = new BelTwitContext(Helper.BelTwitDbOptions))
                {
                    _db.RefreshTokens.Remove(RefreshToken);
                    _db.SaveChanges();
                }
                throw new Exception("Refresh token expired. Authentificate again!");
            }


            //при обновлении Access обновляется і Refresh
            //expiration у Refresh нужен только лішь для случаю отсутсвія в сеті 60 дней (тогда нужно вводіть пароль)
            if (AccessToken.IsTokenExpired())
            {
                AccessToken = new JWT(RefreshToken.User);


                using (var _db = new BelTwitContext(Helper.BelTwitDbOptions))
                {
                    _db.RefreshTokens.Remove(RefreshToken);
                    var refreshToken = new RefreshToken
                    {
                        TokenValue = new Guid(),
                        ExpiresAt  = DateTime.Now.AddDays(60),
                        UserId     = RefreshToken.UserId,
                        User       = RefreshToken.User
                    };
                    _db.RefreshTokens.Add(refreshToken);
                    _db.SaveChanges();

                    RefreshToken = refreshToken;
                }
            }
        }
Exemple #3
0
        public ActionResult AddTweet([FromBody] JwtWtihObject <Tweet> jwtWithTweet)
        {
            JWT token;

            try
            {
                token = new JWT(jwtWithTweet.JWT);
            }
            catch (Exception ex)
            {
                _logger.LogError($"[POST]api/twitter;" + ex.Message);
                return(BadRequest(ex.Message));
            }
            var user = _db.Users
                       .FirstOrDefault(p => p.Id == token.PAYLOAD.Sub);

            if (user == null)
            {
                return(NotFound("Your jwt doesn't match any user!"));
            }



            var tweetJSON = jwtWithTweet.WithJWTObject;

            if (tweetJSON == null)
            {
                return(BadRequest("No tweet object in request"));
            }
            tweetJSON.UserId = token.PAYLOAD.Sub;

            Tweet tweet;

            try
            {
                tweet = new Tweet(tweetJSON);
            }
            catch (Exception ex)
            {
                _logger.LogError($"[POST]api/twitter;" + ex.Message);
                return(BadRequest(ex.Message));
            }

            _db.Tweets.Add(tweet);
            _db.SaveChanges();


            _logger.LogInformation($"[POST]api/twitter;" +
                                   $"User [{user.Login}] added tweet [{tweet.Id}]");
            return(Ok(tweet));
        }
        public ActionResult Subscribe([FromBody] JwtWtihObject <string> subInfo)
        {
            JWT token;

            try
            {
                token = new JWT(subInfo.JWT);
            }
            catch (Exception ex)
            {
                _logger.LogError($"[POST]api/auth/subscribe" + ex.Message);
                return(BadRequest(ex.Message));
            }

            var userWhoSubscribe = _db.Users
                                   .FirstOrDefault(p => p.Id == token.PAYLOAD.Sub);

            if (userWhoSubscribe == null)
            {
                return(NotFound("No user that matches this JWT"));
            }

            var userToSubscribe = _db.Users
                                  .FirstOrDefault(p => p.Login == subInfo.WithJWTObject);

            if (userToSubscribe == null)
            {
                return(NotFound("No user that matches you entered login"));
            }
            if (userToSubscribe == userWhoSubscribe)
            {
                return(BadRequest("You can't subscribe on yourself"));
            }

            var subSub = new SubscriberSubscription
            {
                WhoSubscribeId    = userWhoSubscribe.Id,
                OnWhomSubscribeId = userToSubscribe.Id
            };

            _db.SubscriberSubscriptions.Add(subSub);
            _db.SaveChanges();


            _logger.LogInformation($"[POST]api/auth/subscribe;" +
                                   $"User [{userWhoSubscribe.Login}] subscribed to [{userToSubscribe.Id}]");
            return(Ok(subSub));
        }
        //formatter - проста нейкая функція, которая возвращает сообщение пользователя
        // + состояніе і текст ошібкі (еслі мы таковые передалі)
        public void Log <TState>(LogLevel logLevel, EventId eventId,
                                 TState state, Exception exception, Func <TState, Exception, string> formatter)
        {
            if (logLevel == LogLevel.Error)
            {
                return;
            }

            string[] pathAction = formatter(state, exception).Split(';');
            var      log        = new Log
            {
                Id       = Guid.NewGuid(),
                Date     = DateTime.Now,
                LogLevel = logLevel.ToString(),
                Path     = pathAction[0],
                Action   = pathAction[1],
            };

            _db.Logs.Add(log);
            _db.SaveChanges();  //ORDER BY Date чтобы нормально просматрівать
        }