90 lines
2.6 KiB
Scala
90 lines
2.6 KiB
Scala
package services
|
|
|
|
import org.redisson.Redisson
|
|
import org.redisson.api.RMapCache
|
|
import org.redisson.config.Config
|
|
import play.api.Logger
|
|
import play.api.libs.json.Json
|
|
|
|
import java.util.concurrent.TimeUnit
|
|
import javax.inject.*
|
|
|
|
@Singleton
|
|
class OAuthCacheService @Inject()() {
|
|
|
|
private val logger = Logger(this.getClass)
|
|
|
|
// Initialize Redis connection similar to Gateway
|
|
private val redis = {
|
|
val config: Config = Config()
|
|
val url = "redis://" + sys.env.getOrElse("REDIS_HOST", "localhost") + ":" + sys.env.getOrElse("REDIS_PORT", "6379")
|
|
logger.info(s"OAuthCacheService connecting to Redis at $url")
|
|
config.useSingleServer.setAddress(url)
|
|
Redisson.create(config)
|
|
}
|
|
|
|
// Cache for OAuth data with 30 minute TTL
|
|
private val oauthCache: RMapCache[String, String] = redis.getMapCache("oauth_cache")
|
|
|
|
/**
|
|
* Store OAuth data with random ID and return the ID
|
|
*/
|
|
def storeOAuthData(userInfo: OpenIDUserInfo, accessToken: String, provider: String): String = {
|
|
val sessionId = java.util.UUID.randomUUID().toString
|
|
|
|
val oauthData = Json.obj(
|
|
"userInfo" -> Json.toJson(userInfo),
|
|
"accessToken" -> accessToken,
|
|
"provider" -> provider,
|
|
"timestamp" -> System.currentTimeMillis()
|
|
).toString()
|
|
|
|
// Store with 30 minute TTL
|
|
oauthCache.put(sessionId, oauthData, 30, TimeUnit.MINUTES)
|
|
logger.info(s"Stored OAuth data for session $sessionId")
|
|
|
|
sessionId
|
|
}
|
|
|
|
/**
|
|
* Retrieve OAuth data by session ID
|
|
*/
|
|
def getOAuthData(sessionId: String): Option[(OpenIDUserInfo, String, String)] = {
|
|
Option(oauthCache.get(sessionId)) match {
|
|
case Some(dataJson) =>
|
|
try {
|
|
val json = Json.parse(dataJson)
|
|
val userInfo = (json \ "userInfo").as[OpenIDUserInfo]
|
|
val accessToken = (json \ "accessToken").as[String]
|
|
val provider = (json \ "provider").as[String]
|
|
|
|
logger.info(s"Retrieved OAuth data for session $sessionId")
|
|
Some((userInfo, accessToken, provider))
|
|
} catch {
|
|
case e: Exception =>
|
|
logger.error(s"Failed to parse OAuth data for session $sessionId: ${e.getMessage}")
|
|
None
|
|
}
|
|
case None =>
|
|
logger.warn(s"No OAuth data found for session $sessionId")
|
|
None
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove OAuth data after use
|
|
*/
|
|
def removeOAuthData(sessionId: String): Unit = {
|
|
oauthCache.remove(sessionId)
|
|
logger.info(s"Removed OAuth data for session $sessionId")
|
|
}
|
|
|
|
/**
|
|
* Clean up expired sessions (optional maintenance)
|
|
*/
|
|
def cleanupExpiredSessions(): Unit = {
|
|
oauthCache.clear()
|
|
logger.info("Cleaned up expired OAuth sessions")
|
|
}
|
|
}
|