Add JWT configuration and implement token generation in Steam login callback
Some checks failed
CI - Build and Push / Build and Push Docker Image (push) Failing after 6m33s
Some checks failed
CI - Build and Push / Build and Push Docker Image (push) Failing after 6m33s
This commit is contained in:
@@ -6,6 +6,11 @@ Steam:
|
|||||||
CallbackURL: https://www.cialloo.com/api/authenticator/steam/callback
|
CallbackURL: https://www.cialloo.com/api/authenticator/steam/callback
|
||||||
FrontendCallbackURL: https://www.cialloo.com/auth/callback
|
FrontendCallbackURL: https://www.cialloo.com/auth/callback
|
||||||
|
|
||||||
|
JWT:
|
||||||
|
Secret: your-secret-key-change-in-production
|
||||||
|
Issuer: cialloo-authenticator
|
||||||
|
ExpiresIn: 604800 # 7 days in seconds
|
||||||
|
|
||||||
Redis:
|
Redis:
|
||||||
Host: redis.production.svc.cluster.local:6379
|
Host: redis.production.svc.cluster.local:6379
|
||||||
Type: node
|
Type: node
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ module src
|
|||||||
go 1.24.4
|
go 1.24.4
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.5.2
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/zeromicro/go-zero v1.9.1
|
github.com/zeromicro/go-zero v1.9.1
|
||||||
)
|
)
|
||||||
@@ -15,7 +16,6 @@ require (
|
|||||||
github.com/fatih/color v1.18.0 // indirect
|
github.com/fatih/color v1.18.0 // indirect
|
||||||
github.com/go-logr/logr v1.4.2 // indirect
|
github.com/go-logr/logr v1.4.2 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
|
|
||||||
github.com/grafana/pyroscope-go v1.2.7 // indirect
|
github.com/grafana/pyroscope-go v1.2.7 // indirect
|
||||||
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 // indirect
|
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
type Config struct {
|
type Config struct {
|
||||||
rest.RestConf
|
rest.RestConf
|
||||||
Steam SteamConfig
|
Steam SteamConfig
|
||||||
|
JWT JWTConfig
|
||||||
Redis redis.RedisConf
|
Redis redis.RedisConf
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -15,3 +16,9 @@ type SteamConfig struct {
|
|||||||
CallbackURL string
|
CallbackURL string
|
||||||
FrontendCallbackURL string
|
FrontendCallbackURL string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type JWTConfig struct {
|
||||||
|
Secret string
|
||||||
|
Issuer string
|
||||||
|
ExpiresIn int64
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,11 +5,13 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"time"
|
||||||
|
|
||||||
"src/internal/svc"
|
"src/internal/svc"
|
||||||
"src/internal/types"
|
"src/internal/types"
|
||||||
"src/internal/utils/steamauth"
|
"src/internal/utils/steamauth"
|
||||||
|
|
||||||
|
"github.com/golang-jwt/jwt/v4"
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -19,6 +21,12 @@ type SteamLoginCallbackLogic struct {
|
|||||||
svcCtx *svc.ServiceContext
|
svcCtx *svc.ServiceContext
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// JWT Claims structure
|
||||||
|
type SteamJWTClaims struct {
|
||||||
|
SteamID string `json:"steamId"`
|
||||||
|
jwt.RegisteredClaims
|
||||||
|
}
|
||||||
|
|
||||||
// Steam login callback
|
// Steam login callback
|
||||||
func NewSteamLoginCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SteamLoginCallbackLogic {
|
func NewSteamLoginCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SteamLoginCallbackLogic {
|
||||||
return &SteamLoginCallbackLogic{
|
return &SteamLoginCallbackLogic{
|
||||||
@@ -100,9 +108,44 @@ func (l *SteamLoginCallbackLogic) SteamLoginCallback(req *types.SteamLoginCallba
|
|||||||
// Successful validation
|
// Successful validation
|
||||||
l.Logger.Infof("Steam login successful for Steam ID: %s (nonce: %s)", steamID, nonce)
|
l.Logger.Infof("Steam login successful for Steam ID: %s (nonce: %s)", steamID, nonce)
|
||||||
|
|
||||||
// Redirect to frontend with success status and Steam ID
|
// Generate JWT token
|
||||||
redirectURL := fmt.Sprintf("%s?status=success&steamId=%s", frontendCallbackURL, steamID)
|
token, err := l.generateJWT(steamID)
|
||||||
|
if err != nil {
|
||||||
|
l.Logger.Errorf("Failed to generate JWT token: %v", err)
|
||||||
|
redirectURL := fmt.Sprintf("%s?status=error&message=%s", frontendCallbackURL, url.QueryEscape("Failed to generate authentication token"))
|
||||||
|
http.Redirect(w, r, redirectURL, http.StatusFound)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Redirect to frontend with success status, Steam ID, and JWT token
|
||||||
|
redirectURL := fmt.Sprintf("%s?status=success&steamId=%s&token=%s", frontendCallbackURL, steamID, token)
|
||||||
http.Redirect(w, r, redirectURL, http.StatusFound)
|
http.Redirect(w, r, redirectURL, http.StatusFound)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// generateJWT creates a JWT token for the authenticated user
|
||||||
|
func (l *SteamLoginCallbackLogic) generateJWT(steamID string) (string, error) {
|
||||||
|
// Create claims
|
||||||
|
claims := SteamJWTClaims{
|
||||||
|
SteamID: steamID,
|
||||||
|
RegisteredClaims: jwt.RegisteredClaims{
|
||||||
|
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(l.svcCtx.Config.JWT.ExpiresIn) * time.Second)),
|
||||||
|
IssuedAt: jwt.NewNumericDate(time.Now()),
|
||||||
|
NotBefore: jwt.NewNumericDate(time.Now()),
|
||||||
|
Issuer: l.svcCtx.Config.JWT.Issuer,
|
||||||
|
Subject: steamID,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create token
|
||||||
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
||||||
|
|
||||||
|
// Sign token with secret
|
||||||
|
tokenString, err := token.SignedString([]byte(l.svcCtx.Config.JWT.Secret))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return tokenString, nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user