80 lines
2.3 KiB
Java
80 lines
2.3 KiB
Java
package dev.dinauer.oidcproxy.session;
|
|
|
|
import dev.dinauer.oidcproxy.proxy.exception.TokenNotFoundException;
|
|
import io.quarkus.narayana.jta.QuarkusTransaction;
|
|
import io.quarkus.runtime.Startup;
|
|
import jakarta.enterprise.context.ApplicationScoped;
|
|
import jakarta.enterprise.context.control.ActivateRequestContext;
|
|
import jakarta.inject.Inject;
|
|
import org.jboss.logging.Logger;
|
|
|
|
import java.security.MessageDigest;
|
|
import java.security.NoSuchAlgorithmException;
|
|
import java.time.ZonedDateTime;
|
|
import java.util.*;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.Executors;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
@ApplicationScoped
|
|
public class SessionCache
|
|
{
|
|
private final Map<String, AccessToken> tokens = new ConcurrentHashMap<>();
|
|
|
|
@Inject
|
|
SessionService sessionService;
|
|
|
|
public String add(String accessToken, String refreshToken)
|
|
{
|
|
String sessionId = UUID.randomUUID().toString();
|
|
sessionService.create(toHash(sessionId), new AccessToken(accessToken), new RefreshToken(refreshToken));
|
|
return sessionId;
|
|
}
|
|
|
|
public String get(String sessionId) throws TokenNotFoundException
|
|
{
|
|
String sessionHash = toHash(sessionId);
|
|
Optional<String> token = getFromCache(sessionHash);
|
|
if (token.isPresent())
|
|
{
|
|
return token.get();
|
|
}
|
|
AccessToken fromDB = sessionService.provide(sessionHash);
|
|
tokens.put(sessionHash, fromDB);
|
|
return fromDB.getToken();
|
|
}
|
|
|
|
public void remove(String sessionId)
|
|
{
|
|
String sessionHash = toHash(sessionId);
|
|
tokens.remove(sessionHash);
|
|
sessionService.remove(sessionHash);
|
|
}
|
|
|
|
public Optional<String> getFromCache(String sessionHash)
|
|
{
|
|
AccessToken token = tokens.get(sessionHash);
|
|
if (token != null && ZonedDateTime.now().isBefore(token.getExpiresAt()))
|
|
{
|
|
return Optional.of(token.getToken());
|
|
}
|
|
else
|
|
{
|
|
tokens.remove(sessionHash);
|
|
return Optional.empty();
|
|
}
|
|
}
|
|
|
|
private String toHash(String sessionId)
|
|
{
|
|
try
|
|
{
|
|
return Base64.getEncoder().encodeToString( MessageDigest.getInstance("SHA-256").digest(sessionId.getBytes()));
|
|
}
|
|
catch (NoSuchAlgorithmException e)
|
|
{
|
|
throw new RuntimeException(e);
|
|
}
|
|
}
|
|
}
|