package logic import ( "context" "fmt" "net/http" "time" "git.cialloo.com/CiallooWeb/Authenticator/app/internal/svc" "git.cialloo.com/CiallooWeb/Authenticator/app/internal/types" "git.cialloo.com/CiallooWeb/Authenticator/app/internal/utils/steamauth" "github.com/google/uuid" "github.com/zeromicro/go-zero/core/logx" ) type SteamLoginInitLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } const ( // Redis key prefix for storing nonces nonceKeyPrefix = "steam:nonce:" // Nonce expiration time (5 minutes) nonceExpiration = 5 * time.Minute ) // Initiate Steam login func NewSteamLoginInitLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SteamLoginInitLogic { return &SteamLoginInitLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *SteamLoginInitLogic) SteamLoginInit(req *types.SteamLoginInitReq, w http.ResponseWriter, r *http.Request) error { // Generate a unique nonce (UUID) for this login attempt nonce := uuid.New().String() // Store the nonce in Redis with expiration nonceKey := nonceKeyPrefix + nonce err := l.svcCtx.Redis.Setex(nonceKey, "1", int(nonceExpiration.Seconds())) if err != nil { l.Logger.Errorf("Failed to store nonce in Redis: %v", err) return fmt.Errorf("failed to initialize login session") } // Get the callback URL from config callbackURL := l.svcCtx.Config.Steam.CallbackURL // Append nonce to callback URL for validation later callbackURLWithNonce := fmt.Sprintf("%s?nonce=%s", callbackURL, nonce) // Build the Steam OpenID redirect URL redirectURL := steamauth.GetRedirectURL(callbackURLWithNonce) l.Logger.Infof("Initiating Steam login with nonce: %s, callback URL: %s", nonce, callbackURL) // Redirect user directly to Steam http.Redirect(w, r, redirectURL, http.StatusFound) return nil }