mirror of
				https://github.com/steveiliop56/tinyauth.git
				synced 2025-10-31 06:05:43 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			v3.5.0-alp
			...
			feat/cooki
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 07933ad71c | ||
|   | 7151832cc7 | 
							
								
								
									
										26
									
								
								cmd/root.go
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								cmd/root.go
									
									
									
									
									
								
							| @@ -2,6 +2,7 @@ package cmd | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
|  | 	"fmt" | ||||||
| 	"os" | 	"os" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| @@ -67,6 +68,12 @@ var rootCmd = &cobra.Command{ | |||||||
| 		HandleError(err, "Failed to get upper domain") | 		HandleError(err, "Failed to get upper domain") | ||||||
| 		log.Info().Str("domain", domain).Msg("Using domain for cookie store") | 		log.Info().Str("domain", domain).Msg("Using domain for cookie store") | ||||||
|  |  | ||||||
|  | 		// Generate cookie name | ||||||
|  | 		cookieId := utils.GenerateIdentifier(strings.Split(domain, ".")[0]) | ||||||
|  | 		sessionCookieName := fmt.Sprintf("%s-%s", constants.SessionCookieName, cookieId) | ||||||
|  | 		csrfCookieName := fmt.Sprintf("%s-%s", constants.CsrfCookieName, cookieId) | ||||||
|  | 		redirectCookieName := fmt.Sprintf("%s-%s", constants.RedirectCookieName, cookieId) | ||||||
|  |  | ||||||
| 		// Create OAuth config | 		// Create OAuth config | ||||||
| 		oauthConfig := types.OAuthConfig{ | 		oauthConfig := types.OAuthConfig{ | ||||||
| 			GithubClientId:      config.GithubClientId, | 			GithubClientId:      config.GithubClientId, | ||||||
| @@ -93,6 +100,8 @@ var rootCmd = &cobra.Command{ | |||||||
| 			ForgotPasswordMessage: config.FogotPasswordMessage, | 			ForgotPasswordMessage: config.FogotPasswordMessage, | ||||||
| 			BackgroundImage:       config.BackgroundImage, | 			BackgroundImage:       config.BackgroundImage, | ||||||
| 			OAuthAutoRedirect:     config.OAuthAutoRedirect, | 			OAuthAutoRedirect:     config.OAuthAutoRedirect, | ||||||
|  | 			CsrfCookieName:        csrfCookieName, | ||||||
|  | 			RedirectCookieName:    redirectCookieName, | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// Create api config | 		// Create api config | ||||||
| @@ -103,14 +112,15 @@ var rootCmd = &cobra.Command{ | |||||||
|  |  | ||||||
| 		// Create auth config | 		// Create auth config | ||||||
| 		authConfig := types.AuthConfig{ | 		authConfig := types.AuthConfig{ | ||||||
| 			Users:           users, | 			Users:             users, | ||||||
| 			OauthWhitelist:  config.OAuthWhitelist, | 			OauthWhitelist:    config.OAuthWhitelist, | ||||||
| 			Secret:          config.Secret, | 			Secret:            config.Secret, | ||||||
| 			CookieSecure:    config.CookieSecure, | 			CookieSecure:      config.CookieSecure, | ||||||
| 			SessionExpiry:   config.SessionExpiry, | 			SessionExpiry:     config.SessionExpiry, | ||||||
| 			Domain:          domain, | 			Domain:            domain, | ||||||
| 			LoginTimeout:    config.LoginTimeout, | 			LoginTimeout:      config.LoginTimeout, | ||||||
| 			LoginMaxRetries: config.LoginMaxRetries, | 			LoginMaxRetries:   config.LoginMaxRetries, | ||||||
|  | 			SessionCookieName: sessionCookieName, | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// Create hooks config | 		// Create hooks config | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							| @@ -6,6 +6,7 @@ require ( | |||||||
| 	github.com/gin-gonic/gin v1.10.0 | 	github.com/gin-gonic/gin v1.10.0 | ||||||
| 	github.com/go-playground/validator/v10 v10.26.0 | 	github.com/go-playground/validator/v10 v10.26.0 | ||||||
| 	github.com/google/go-querystring v1.1.0 | 	github.com/google/go-querystring v1.1.0 | ||||||
|  | 	github.com/google/uuid v1.6.0 | ||||||
| 	github.com/mdp/qrterminal/v3 v3.2.1 | 	github.com/mdp/qrterminal/v3 v3.2.1 | ||||||
| 	github.com/rs/zerolog v1.34.0 | 	github.com/rs/zerolog v1.34.0 | ||||||
| 	github.com/spf13/cobra v1.9.1 | 	github.com/spf13/cobra v1.9.1 | ||||||
|   | |||||||
| @@ -28,21 +28,29 @@ var apiConfig = types.APIConfig{ | |||||||
| // Simple handlers config for tests | // Simple handlers config for tests | ||||||
| var handlersConfig = types.HandlersConfig{ | var handlersConfig = types.HandlersConfig{ | ||||||
| 	AppURL:                "http://localhost:8080", | 	AppURL:                "http://localhost:8080", | ||||||
|  | 	Domain:                "localhost", | ||||||
| 	DisableContinue:       false, | 	DisableContinue:       false, | ||||||
|  | 	CookieSecure:          false, | ||||||
| 	Title:                 "Tinyauth", | 	Title:                 "Tinyauth", | ||||||
| 	GenericName:           "Generic", | 	GenericName:           "Generic", | ||||||
| 	ForgotPasswordMessage: "Some message", | 	ForgotPasswordMessage: "Some message", | ||||||
|  | 	CsrfCookieName:        "tinyauth-csrf", | ||||||
|  | 	RedirectCookieName:    "tinyauth-redirect", | ||||||
|  | 	BackgroundImage:       "https://example.com/image.png", | ||||||
|  | 	OAuthAutoRedirect:     "none", | ||||||
| } | } | ||||||
|  |  | ||||||
| // Simple auth config for tests | // Simple auth config for tests | ||||||
| var authConfig = types.AuthConfig{ | var authConfig = types.AuthConfig{ | ||||||
| 	Users:           types.Users{}, | 	Users:             types.Users{}, | ||||||
| 	OauthWhitelist:  "", | 	OauthWhitelist:    "", | ||||||
| 	Secret:          "super-secret-api-thing-for-tests", // It is 32 chars long | 	Secret:            "super-secret-api-thing-for-tests", // It is 32 chars long | ||||||
| 	CookieSecure:    false, | 	CookieSecure:      false, | ||||||
| 	SessionExpiry:   3600, | 	SessionExpiry:     3600, | ||||||
| 	LoginTimeout:    0, | 	LoginTimeout:      0, | ||||||
| 	LoginMaxRetries: 0, | 	LoginMaxRetries:   0, | ||||||
|  | 	SessionCookieName: "tinyauth-session", | ||||||
|  | 	Domain:            "localhost", | ||||||
| } | } | ||||||
|  |  | ||||||
| // Simple hooks config for tests | // Simple hooks config for tests | ||||||
| @@ -206,6 +214,9 @@ func TestAppContext(t *testing.T) { | |||||||
| 		Title:                 "Tinyauth", | 		Title:                 "Tinyauth", | ||||||
| 		GenericName:           "Generic", | 		GenericName:           "Generic", | ||||||
| 		ForgotPasswordMessage: "Some message", | 		ForgotPasswordMessage: "Some message", | ||||||
|  | 		BackgroundImage:       "https://example.com/image.png", | ||||||
|  | 		OAuthAutoRedirect:     "none", | ||||||
|  | 		Domain:                "localhost", | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// We should get the username back | 	// We should get the username back | ||||||
| @@ -234,7 +245,7 @@ func TestUserContext(t *testing.T) { | |||||||
|  |  | ||||||
| 	// Set the cookie | 	// Set the cookie | ||||||
| 	req.AddCookie(&http.Cookie{ | 	req.AddCookie(&http.Cookie{ | ||||||
| 		Name:  "tinyauth", | 		Name:  "tinyauth-session", | ||||||
| 		Value: cookie, | 		Value: cookie, | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -45,7 +45,7 @@ func (auth *Auth) GetSession(c *gin.Context) (*sessions.Session, error) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Get session | 	// Get session | ||||||
| 	session, err := store.Get(c.Request, "tinyauth") | 	session, err := store.Get(c.Request, auth.Config.SessionCookieName) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error().Err(err).Msg("Failed to get session") | 		log.Error().Err(err).Msg("Failed to get session") | ||||||
| 		return nil, err | 		return nil, err | ||||||
|   | |||||||
| @@ -21,3 +21,8 @@ type Claims struct { | |||||||
| var Version = "development" | var Version = "development" | ||||||
| var CommitHash = "n/a" | var CommitHash = "n/a" | ||||||
| var BuildTimestamp = "n/a" | var BuildTimestamp = "n/a" | ||||||
|  |  | ||||||
|  | // Cookie names | ||||||
|  | var SessionCookieName = "tinyauth-session" | ||||||
|  | var CsrfCookieName = "tinyauth-csrf" | ||||||
|  | var RedirectCookieName = "tinyauth-redirect" | ||||||
|   | |||||||
| @@ -581,7 +581,7 @@ func (h *Handlers) OauthUrlHandler(c *gin.Context) { | |||||||
| 	log.Debug().Msg("Got auth URL") | 	log.Debug().Msg("Got auth URL") | ||||||
|  |  | ||||||
| 	// Set CSRF cookie | 	// Set CSRF cookie | ||||||
| 	c.SetCookie("tinyauth-csrf", state, int(time.Hour.Seconds()), "/", "", h.Config.CookieSecure, true) | 	c.SetCookie(h.Config.CsrfCookieName, state, int(time.Hour.Seconds()), "/", "", h.Config.CookieSecure, true) | ||||||
|  |  | ||||||
| 	// Get redirect URI | 	// Get redirect URI | ||||||
| 	redirectURI := c.Query("redirect_uri") | 	redirectURI := c.Query("redirect_uri") | ||||||
| @@ -589,7 +589,7 @@ func (h *Handlers) OauthUrlHandler(c *gin.Context) { | |||||||
| 	// Set redirect cookie if redirect URI is provided | 	// Set redirect cookie if redirect URI is provided | ||||||
| 	if redirectURI != "" { | 	if redirectURI != "" { | ||||||
| 		log.Debug().Str("redirectURI", redirectURI).Msg("Setting redirect cookie") | 		log.Debug().Str("redirectURI", redirectURI).Msg("Setting redirect cookie") | ||||||
| 		c.SetCookie("tinyauth-redirect", redirectURI, int(time.Hour.Seconds()), "/", "", h.Config.CookieSecure, true) | 		c.SetCookie(h.Config.RedirectCookieName, redirectURI, int(time.Hour.Seconds()), "/", "", h.Config.CookieSecure, true) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Return auth URL | 	// Return auth URL | ||||||
| @@ -620,7 +620,7 @@ func (h *Handlers) OauthCallbackHandler(c *gin.Context) { | |||||||
| 	state := c.Query("state") | 	state := c.Query("state") | ||||||
|  |  | ||||||
| 	// Get CSRF cookie | 	// Get CSRF cookie | ||||||
| 	csrfCookie, err := c.Cookie("tinyauth-csrf") | 	csrfCookie, err := c.Cookie(h.Config.CsrfCookieName) | ||||||
|  |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Debug().Msg("No CSRF cookie") | 		log.Debug().Msg("No CSRF cookie") | ||||||
| @@ -638,7 +638,7 @@ func (h *Handlers) OauthCallbackHandler(c *gin.Context) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Clean up CSRF cookie | 	// Clean up CSRF cookie | ||||||
| 	c.SetCookie("tinyauth-csrf", "", -1, "/", "", h.Config.CookieSecure, true) | 	c.SetCookie(h.Config.CsrfCookieName, "", -1, "/", "", h.Config.CookieSecure, true) | ||||||
|  |  | ||||||
| 	// Get code | 	// Get code | ||||||
| 	code := c.Query("code") | 	code := c.Query("code") | ||||||
| @@ -737,7 +737,7 @@ func (h *Handlers) OauthCallbackHandler(c *gin.Context) { | |||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	// Check if we have a redirect URI | 	// Check if we have a redirect URI | ||||||
| 	redirectCookie, err := c.Cookie("tinyauth-redirect") | 	redirectCookie, err := c.Cookie(h.Config.RedirectCookieName) | ||||||
|  |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Debug().Msg("No redirect cookie") | 		log.Debug().Msg("No redirect cookie") | ||||||
| @@ -762,7 +762,7 @@ func (h *Handlers) OauthCallbackHandler(c *gin.Context) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Clean up redirect cookie | 	// Clean up redirect cookie | ||||||
| 	c.SetCookie("tinyauth-redirect", "", -1, "/", "", h.Config.CookieSecure, true) | 	c.SetCookie(h.Config.RedirectCookieName, "", -1, "/", "", h.Config.CookieSecure, true) | ||||||
|  |  | ||||||
| 	// Redirect to continue with the redirect URI | 	// Redirect to continue with the redirect URI | ||||||
| 	c.Redirect(http.StatusPermanentRedirect, fmt.Sprintf("%s/continue?%s", h.Config.AppURL, queries.Encode())) | 	c.Redirect(http.StatusPermanentRedirect, fmt.Sprintf("%s/continue?%s", h.Config.AppURL, queries.Encode())) | ||||||
|   | |||||||
| @@ -48,6 +48,8 @@ type HandlersConfig struct { | |||||||
| 	ForgotPasswordMessage string | 	ForgotPasswordMessage string | ||||||
| 	BackgroundImage       string | 	BackgroundImage       string | ||||||
| 	OAuthAutoRedirect     string | 	OAuthAutoRedirect     string | ||||||
|  | 	CsrfCookieName        string | ||||||
|  | 	RedirectCookieName    string | ||||||
| } | } | ||||||
|  |  | ||||||
| // OAuthConfig is the configuration for the providers | // OAuthConfig is the configuration for the providers | ||||||
| @@ -73,14 +75,15 @@ type APIConfig struct { | |||||||
|  |  | ||||||
| // AuthConfig is the configuration for the auth service | // AuthConfig is the configuration for the auth service | ||||||
| type AuthConfig struct { | type AuthConfig struct { | ||||||
| 	Users           Users | 	Users             Users | ||||||
| 	OauthWhitelist  string | 	OauthWhitelist    string | ||||||
| 	SessionExpiry   int | 	SessionExpiry     int | ||||||
| 	Secret          string | 	Secret            string | ||||||
| 	CookieSecure    bool | 	CookieSecure      bool | ||||||
| 	Domain          string | 	Domain            string | ||||||
| 	LoginTimeout    int | 	LoginTimeout      int | ||||||
| 	LoginMaxRetries int | 	LoginMaxRetries   int | ||||||
|  | 	SessionCookieName string | ||||||
| } | } | ||||||
|  |  | ||||||
| // HooksConfig is the configuration for the hooks service | // HooksConfig is the configuration for the hooks service | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ import ( | |||||||
| 	"tinyauth/internal/constants" | 	"tinyauth/internal/constants" | ||||||
| 	"tinyauth/internal/types" | 	"tinyauth/internal/types" | ||||||
|  |  | ||||||
|  | 	"github.com/google/uuid" | ||||||
| 	"github.com/rs/zerolog/log" | 	"github.com/rs/zerolog/log" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -344,3 +345,18 @@ func SanitizeHeader(header string) string { | |||||||
| 		return -1 | 		return -1 | ||||||
| 	}, header) | 	}, header) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Generate a static identifier from a string | ||||||
|  | func GenerateIdentifier(str string) string { | ||||||
|  | 	// Create a new UUID | ||||||
|  | 	uuid := uuid.NewSHA1(uuid.NameSpaceURL, []byte(str)) | ||||||
|  |  | ||||||
|  | 	// Convert the UUID to a string | ||||||
|  | 	uuidString := uuid.String() | ||||||
|  |  | ||||||
|  | 	// Show the UUID | ||||||
|  | 	log.Debug().Str("uuid", uuidString).Msg("Generated UUID") | ||||||
|  |  | ||||||
|  | 	// Convert the UUID to a string | ||||||
|  | 	return strings.Split(uuidString, "-")[0] | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user