feat: Implement Steam login initialization logic
Some checks failed
CI - Build and Push / Build and Push Docker Image (push) Failing after 32s

- Added SteamLoginInitLogic to handle the initiation of Steam login.
- Created service context for managing configuration and Redis connection.
- Defined types for Steam login requests and callbacks.
- Implemented utility functions for building OpenID query strings and validating responses from Steam.
- Updated go.mod and go.sum to include necessary dependencies.
- Modified GenApi.ps1 script to generate code in the correct directory.
This commit is contained in:
2025-10-12 10:54:11 +08:00
parent cde4235332
commit b6c464cb12
18 changed files with 35 additions and 35 deletions

View File

@@ -0,0 +1,66 @@
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
}