SUPPORT-8942: Fix

This commit is contained in:
Eduard Tihomirov 2025-02-26 12:29:48 +03:00
parent cb1d4b2730
commit 91c9214560
6 changed files with 23 additions and 25 deletions

View file

@ -24,7 +24,7 @@ import ru.micord.ervu.kafka.dto.FullExtract;
import ru.micord.ervu.kafka.service.ReplyingKafkaService;
import ru.micord.ervu.security.esia.model.PersonModel;
import ru.micord.ervu.security.esia.service.PersonalDataService;
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
import ru.micord.ervu.security.esia.token.EsiaAuthInfoStore;
import ru.micord.ervu.security.webbpm.jwt.UserIdsPair;
import ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil;
@ -69,7 +69,7 @@ public class ExtractController {
}
else {
String esiaUserId = userIdsPair.getEsiaUserId(); // esiaUserId is not null here
String esiaAccessToken = EsiaTokensStore.getAccessToken(esiaUserId);
String esiaAccessToken = EsiaAuthInfoStore.getAccessToken(esiaUserId);
PersonModel personModel = personalDataService.getPersonModel(esiaAccessToken);
ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto(

View file

@ -56,7 +56,7 @@ public class EsiaConfig {
@Value("${esia.marker.ver}")
private String esiaMarkerVer;
@Value("${esia.state.cookie.life.time.min:60}")
@Value("${esia.state.cookie.life.time:300}")
private long esiaStateCookieLifeTime;
@ -121,6 +121,6 @@ public class EsiaConfig {
public long getEsiaStateCookieLifeTime() {
return esiaStateCookieLifeTime * 60L;
return esiaStateCookieLifeTime;
}
}

View file

@ -16,7 +16,6 @@ import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
@ -42,7 +41,7 @@ import ru.micord.ervu.security.esia.model.EsiaHeader;
import ru.micord.ervu.security.esia.model.EsiaTokenResponse;
import ru.micord.ervu.security.esia.model.FormUrlencoded;
import ru.micord.ervu.security.esia.model.PersonModel;
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
import ru.micord.ervu.security.esia.token.EsiaAuthInfoStore;
import ru.micord.ervu.security.esia.config.EsiaConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
@ -54,7 +53,6 @@ import ru.micord.ervu.security.webbpm.jwt.helper.SecurityHelper;
import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService;
import ru.micord.ervu.security.webbpm.jwt.model.Token;
import static ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil.getCurrentUserEsiaId;
import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils;
/**
@ -112,7 +110,7 @@ public class EsiaAuthService {
parameters.put("redirect_uri", esiaConfig.getRedirectUrl());
String clientSecret = signMap(parameters);
EsiaTokensStore.addState(prnsUUID, state, esiaConfig.getEsiaStateCookieLifeTime());
EsiaAuthInfoStore.addState(prnsUUID, state, esiaConfig.getEsiaStateCookieLifeTime());
ResponseCookie prnsCookie = securityHelper.createCookie(PRNS_UUID, prnsUUID, "/")
.maxAge(esiaConfig.getEsiaStateCookieLifeTime())
.build();
@ -242,8 +240,8 @@ public class EsiaAuthService {
EsiaAccessToken esiaAccessToken = personalDataService.readToken(esiaAccessTokenStr);
prnOid = esiaAccessToken.getSbj_id();
expiresIn = tokenResponse.getExpires_in();
EsiaTokensStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
EsiaTokensStore.addRefreshToken(prnOid, esiaRefreshTokenStr, expiresIn);
EsiaAuthInfoStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
EsiaAuthInfoStore.addRefreshToken(prnOid, esiaRefreshTokenStr, expiresIn);
}
catch (Exception e) {
throw new EsiaException(e);
@ -324,8 +322,8 @@ public class EsiaAuthService {
EsiaAccessToken esiaAccessToken = personalDataService.readToken(esiaAccessTokenStr);
String prnOid = esiaAccessToken.getSbj_id();
Long expiresIn = tokenResponse.getExpires_in();
EsiaTokensStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
EsiaTokensStore.addRefreshToken(prnOid, esiaNewRefreshTokenStr, expiresIn);
EsiaAuthInfoStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
EsiaAuthInfoStore.addRefreshToken(prnOid, esiaNewRefreshTokenStr, expiresIn);
PersonModel personModel = personalDataService.getPersonModel(esiaAccessTokenStr);
Response ervuIdResponse = getErvuIdResponse(personModel);
createTokenAndAddCookie(response, esiaAccessToken.getSbj_id(), ervuIdResponse.getErvuId(), expiresIn);
@ -372,8 +370,8 @@ public class EsiaAuthService {
try {
securityHelper.clearAccessCookies(response);
String userId = jwtTokenService.getUserAccountId(request);
EsiaTokensStore.removeAccessToken(userId);
EsiaTokensStore.removeRefreshToken(userId);
EsiaAuthInfoStore.removeAccessToken(userId);
EsiaAuthInfoStore.removeRefreshToken(userId);
String logoutUrl = esiaConfig.getEsiaBaseUri() + esiaConfig.getEsiaLogoutUrl();
String redirectUrl = esiaConfig.getLogoutRedirectUrl();
URL url = new URL(logoutUrl);
@ -485,11 +483,11 @@ public class EsiaAuthService {
return "State invalid. Cookie not found";
}
String prnsUUID = cookie.getValue();
String oldState = EsiaTokensStore.getState(prnsUUID);
String oldState = EsiaAuthInfoStore.getState(prnsUUID);
if (oldState == null || !oldState.equals(state)) {
return "State invalid. State from ESIA not equals with state before";
}
EsiaTokensStore.removeState(prnsUUID);
EsiaAuthInfoStore.removeState(prnsUUID);
securityHelper.clearCookie(response, PRNS_UUID, "/");
return null;
}

View file

@ -9,13 +9,13 @@ import org.springframework.transaction.annotation.Transactional;
* @author Eduard Tihomirov
*/
@Service
public class TokensClearShedulerService {
public class EsiaAuthInfoClearShedulerService {
@Scheduled(cron = "${esia.token.clear.cron:0 0 */1 * * *}")
@SchedulerLock(name = "clearToken")
@Transactional
public void clear() {
EsiaTokensStore.removeExpiredRefreshToken();
EsiaTokensStore.removeExpiredAccessToken();
EsiaTokensStore.removeExpiredState();
EsiaAuthInfoStore.removeExpiredRefreshToken();
EsiaAuthInfoStore.removeExpiredAccessToken();
EsiaAuthInfoStore.removeExpiredState();
}
}

View file

@ -10,7 +10,7 @@ import org.slf4j.LoggerFactory;
/**
* @author Eduard Tihomirov
*/
public class EsiaTokensStore {
public class EsiaAuthInfoStore {
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final Map<String, ExpiringToken> accessTokensMap = new ConcurrentHashMap<>();
private static final Map<String, ExpiringToken> refreshTokensMap = new ConcurrentHashMap<>();

View file

@ -14,7 +14,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
import ru.micord.ervu.security.esia.token.EsiaAuthInfoStore;
import ru.micord.ervu.security.webbpm.jwt.UserIdsPair;
import ru.micord.ervu.security.webbpm.jwt.model.Token;
@ -67,7 +67,7 @@ public class JwtTokenService {
return false;
}
String esiaUserId = new UserIdsPair(token.getUserAccountId()).getEsiaUserId();
return EsiaTokensStore.validateAccessToken(esiaUserId);
return EsiaAuthInfoStore.validateAccessToken(esiaUserId);
}
public Token getToken(String token) {
@ -80,11 +80,11 @@ public class JwtTokenService {
}
public String getAccessToken(HttpServletRequest request) {
return EsiaTokensStore.getAccessToken(getUserAccountId(request));
return EsiaAuthInfoStore.getAccessToken(getUserAccountId(request));
}
public String getRefreshToken(HttpServletRequest request) {
return EsiaTokensStore.getRefreshToken(getUserAccountId(request));
return EsiaAuthInfoStore.getRefreshToken(getUserAccountId(request));
}
public String getUserAccountId(HttpServletRequest request) {