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(); } }
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; } } }
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 чтобы нормально просматрівать }