From 3654161245ef4327f211af8d7a4212de95deba32 Mon Sep 17 00:00:00 2001 From: StarFleetCPTN Date: Mon, 7 Apr 2025 09:24:46 -0700 Subject: [PATCH] feat: Enhance login functionality to support external authentication providers - Updated the Login template to conditionally display external authentication options based on the presence of enabled providers. - Modified the HandleLoginPage and HandleLogin functions to check for available external providers and pass this information to the Login template. - Improved user experience by dynamically showing or hiding external sign-in options during the login process. --- components/login.templ | 18 ++++++++------- internal/web/handlers/auth_handlers.go | 31 ++++++++++++++++++++------ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/components/login.templ b/components/login.templ index e63ce9d..6b76f46 100644 --- a/components/login.templ +++ b/components/login.templ @@ -5,7 +5,7 @@ import ( "strings" ) -templ Login(ctx context.Context, errorMessage string) { +templ Login(ctx context.Context, errorMessage string, hasExternalProviders bool) { @LayoutWithContext("Login", ctx) {
@@ -116,15 +116,17 @@ templ Login(ctx context.Context, errorMessage string) { Contact an administrator to create an account

- -
-

Or sign in with:

-
-
-
+ if hasExternalProviders { + +
+

Or sign in with:

+
+
+
+
-
+ }
diff --git a/internal/web/handlers/auth_handlers.go b/internal/web/handlers/auth_handlers.go index 27624bb..b220270 100644 --- a/internal/web/handlers/auth_handlers.go +++ b/internal/web/handlers/auth_handlers.go @@ -278,11 +278,20 @@ func (h *Handlers) HandleLoginPage(c *gin.Context) { // Check for message query param (used for password expired, etc.) message := c.Query("message") + // Check if external providers exist + var providerCount int64 + if err := h.DB.Model(&db.AuthProvider{}).Where("enabled = ?", true).Count(&providerCount).Error; err != nil { + log.Printf("Error counting auth providers: %v", err) + // Assume no providers if there's an error, or handle differently + providerCount = 0 + } + hasExternalProviders := providerCount > 0 + // User is not logged in, show login page if message != "" { - components.Login(ctx, message).Render(c.Request.Context(), c.Writer) + components.Login(ctx, message, hasExternalProviders).Render(c.Request.Context(), c.Writer) } else { - components.Login(ctx, "").Render(c.Request.Context(), c.Writer) + components.Login(ctx, "", hasExternalProviders).Render(c.Request.Context(), c.Writer) } } @@ -291,10 +300,18 @@ func (h *Handlers) HandleLogin(c *gin.Context) { email := c.PostForm("email") password := c.PostForm("password") + // Check if external providers exist + var providerCount int64 + if err := h.DB.Model(&db.AuthProvider{}).Where("enabled = ?", true).Count(&providerCount).Error; err != nil { + log.Printf("Error counting auth providers: %v", err) + providerCount = 0 + } + hasExternalProviders := providerCount > 0 + // Get user by email var user db.User if err := h.DB.Where("email = ?", email).First(&user).Error; err != nil { - components.Login(components.CreateTemplateContext(c), "Invalid credentials").Render(c, c.Writer) + components.Login(components.CreateTemplateContext(c), "Invalid credentials", hasExternalProviders).Render(c, c.Writer) return } @@ -308,7 +325,7 @@ func (h *Handlers) HandleLogin(c *gin.Context) { h.DB.Save(&user) } else { // Account is still locked - components.Login(components.CreateTemplateContext(c), "Account is locked due to too many failed login attempts. Please try again later.").Render(c, c.Writer) + components.Login(components.CreateTemplateContext(c), "Account is locked due to too many failed login attempts. Please try again later.", hasExternalProviders).Render(c, c.Writer) return } } @@ -325,12 +342,12 @@ func (h *Handlers) HandleLogin(c *gin.Context) { lockoutTime := time.Now().Add(policy.LockoutDuration) user.LockoutUntil = &lockoutTime h.DB.Save(&user) - components.Login(components.CreateTemplateContext(c), "Account is locked due to too many failed login attempts. Please try again later.").Render(c, c.Writer) + components.Login(components.CreateTemplateContext(c), "Account is locked due to too many failed login attempts. Please try again later.", hasExternalProviders).Render(c, c.Writer) return } h.DB.Save(&user) - components.Login(components.CreateTemplateContext(c), "Invalid credentials").Render(c, c.Writer) + components.Login(components.CreateTemplateContext(c), "Invalid credentials", hasExternalProviders).Render(c, c.Writer) return } @@ -368,7 +385,7 @@ func (h *Handlers) HandleLogin(c *gin.Context) { } token, err := h.GenerateJWT(user.ID, user.Email, isAdmin) if err != nil { - components.Login(components.CreateTemplateContext(c), "Authentication error").Render(c, c.Writer) + components.Login(components.CreateTemplateContext(c), "Authentication error", hasExternalProviders).Render(c, c.Writer) return }