/// <summary> /// ОБновить жетон доступа /// </summary> /// <param name="refreshToken">Токен обновления</param> /// <param name="httpContext">Контекст HTTP</param> /// <returns>Данные о пользователе с очищенным паролем или null, /// при любой ошибке</returns> public UserModel RefreshToken(string refreshToken, HttpContext httpContext) { DateTime now = DateTime.UtcNow; // Получаем текущие дату и время double minutes = 2d; // две минуты // Извлекаем из контекста HTTP тип агента пользователя var userAgent = httpContext.Request.Headers["User-Agent"]; // Извлекаем из контекста HTTP IP адрес пользователя var ipAddress = httpContext.Connection.RemoteIpAddress; // Извлекаем из хранилища данные о жетоне обновления var refToken = tokensManager.GetRefreshToken(refreshToken, userAgent); if (refToken == null) // Если жетон обновления не найден { //logger.LogWarning($"Probable hacker attack attempt for refresh token: {refreshToken}, IP : {ipAddress}"); return(null); // Возвращаем null } // Если IP адреса из контекста HTTP и жетона обновления не совпадают if (ipAddress.ToString() != refToken.IpAddress) { //logger.LogWarning($"Token not found token: {refreshToken} "); return(null); // Возвращаем null } // Извлекаем из хранилища данные о пользователе по адресу электронной почты // с очищенным паролем var user = GetUserByEmail(refToken.UserEmail).WithoutPassword(); if (user == null) // Если пользоваитель не найден { //logger.LogWarning($" user not found for token: {refreshToken} "); return(null); // Возвращаем null } // Генерируем новый эетон доступа string newToken = GenerateToken(userAgent, user, now, minutes); // Обновляем жетон обновления для текущего типа агента пользователя refToken = tokensManager.UpdateToken(refToken.RefreshToken, userAgent); // Устанавливам для пользователя жетон обновления user.RefreshToken = refToken.RefreshToken; // Устанавливаем время истечения срока действия жетона user.TokenExpireTimes = now.AddMinutes(minutes); // 2 минуты // Устанавливаем новый жетон доступа user.Token = newToken; // Возвращаем данные о пользоваителе return(user); }
public UserModel RefreshToken(string refreshToken, HttpContext httpContext) { DateTime now = DateTime.UtcNow; double minutes = 2d; var userAgent = httpContext.Request.Headers["User-Agent"]; var ipAddress = httpContext.Connection.RemoteIpAddress; var refToken = tokensManager.GetRefreshToken(refreshToken, userAgent); if (refToken == null) { //logger.LogWarning($"Probable hacker attack attempt for refresh token: {refreshToken}, IP : {ipAddress}"); return(null); } if (ipAddress.ToString() != refToken.IpAddress) { //logger.LogWarning($"Token not found token: {refreshToken} "); return(null); } var user = GetUserByEmail(refToken.UserEmail).WithoutPassword(); if (user == null) { //logger.LogWarning($" user not found for token: {refreshToken} "); return(null); } string newToken = GenerateToken(userAgent, user, now, minutes); refToken = tokensManager.UpdateToken(refToken.RefreshToken, userAgent); user.RefreshToken = refToken.RefreshToken; user.TokenExpireTimes = now.AddMinutes(minutes); user.Token = newToken; return(user); }