forked from baron/baron-sso
클라이언트 시크릿 캐싱 로직 적용 및 의존성 주입
This commit is contained in:
@@ -3,6 +3,7 @@ package handler
|
||||
import (
|
||||
"baron-sso-backend/internal/domain"
|
||||
"baron-sso-backend/internal/service"
|
||||
"context"
|
||||
"errors"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -12,14 +13,16 @@ import (
|
||||
)
|
||||
|
||||
type DevHandler struct {
|
||||
Hydra *service.HydraAdminService
|
||||
Redis *service.RedisService
|
||||
Hydra *service.HydraAdminService
|
||||
Redis *service.RedisService
|
||||
SecretRepo domain.ClientSecretRepository
|
||||
}
|
||||
|
||||
func NewDevHandler(redis *service.RedisService) *DevHandler {
|
||||
func NewDevHandler(redis *service.RedisService, secretRepo domain.ClientSecretRepository) *DevHandler {
|
||||
return &DevHandler{
|
||||
Hydra: service.NewHydraAdminService(),
|
||||
Redis: redis,
|
||||
Hydra: service.NewHydraAdminService(),
|
||||
Redis: redis,
|
||||
SecretRepo: secretRepo,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,13 +252,12 @@ func (h *DevHandler) CreateClient(c *fiber.Ctx) error {
|
||||
|
||||
// Store secret in metadata for later retrieval
|
||||
if created.ClientSecret != "" {
|
||||
if created.Metadata == nil {
|
||||
created.Metadata = map[string]interface{}{}
|
||||
// 1. Store in PostgreSQL (Source of Truth)
|
||||
if h.SecretRepo != nil {
|
||||
_ = h.SecretRepo.Upsert(c.Context(), created.ClientID, created.ClientSecret)
|
||||
}
|
||||
created.Metadata["client_secret"] = created.ClientSecret
|
||||
_, _ = h.Hydra.UpdateClient(c.Context(), created.ClientID, *created)
|
||||
|
||||
// Also store in Redis if available
|
||||
|
||||
// 2. Also store in Redis (Cache)
|
||||
if h.Redis != nil {
|
||||
_ = h.Redis.Set("client_secret:"+created.ClientID, created.ClientSecret, 0)
|
||||
}
|
||||
@@ -375,7 +377,12 @@ func (h *DevHandler) DeleteClient(c *fiber.Ctx) error {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
|
||||
}
|
||||
|
||||
// Clean up Redis
|
||||
// 1. Clean up PostgreSQL
|
||||
if h.SecretRepo != nil {
|
||||
_ = h.SecretRepo.Delete(c.Context(), clientID)
|
||||
}
|
||||
|
||||
// 2. Clean up Redis
|
||||
if h.Redis != nil {
|
||||
_ = h.Redis.Delete("client_secret:" + clientID)
|
||||
}
|
||||
@@ -466,13 +473,25 @@ func (h *DevHandler) mapClientSummary(client domain.HydraClient) clientSummary {
|
||||
clientSecret = val
|
||||
}
|
||||
}
|
||||
// 2. Check Redis (New)
|
||||
|
||||
// 2. Check Redis (Cache)
|
||||
if clientSecret == "" && h.Redis != nil {
|
||||
if val, err := h.Redis.Get("client_secret:" + client.ClientID); err == nil && val != "" {
|
||||
clientSecret = val
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Check PostgreSQL (Source of Truth) & Cache Warming
|
||||
if clientSecret == "" && h.SecretRepo != nil {
|
||||
if val, err := h.SecretRepo.GetByID(context.Background(), client.ClientID); err == nil && val != "" {
|
||||
clientSecret = val
|
||||
// Warm up cache
|
||||
if h.Redis != nil {
|
||||
_ = h.Redis.Set("client_secret:"+client.ClientID, clientSecret, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return clientSummary{
|
||||
ID: client.ClientID,
|
||||
Name: name,
|
||||
|
||||
Reference in New Issue
Block a user