feat: Implement Steam login initialization logic
Some checks failed
CI - Build and Push / Build and Push Docker Image (push) Failing after 32s
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:
66
app/internal/logic/steamlogininitlogic.go
Normal file
66
app/internal/logic/steamlogininitlogic.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user