From 59ff04dbbc44ac0ef56e5f0346f8f46394ab0ec1 Mon Sep 17 00:00:00 2001 From: Luiz Vasconcelos Date: Tue, 25 Mar 2025 13:27:03 +0100 Subject: [PATCH] Include identities to user claims --- handlers.go | 26 ++++++++++++++++++-------- session.go | 8 +++++--- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/handlers.go b/handlers.go index 80f3da2..687d0a1 100644 --- a/handlers.go +++ b/handlers.go @@ -26,14 +26,21 @@ func NewHandler(oauth2Config *oauth2.Config, session SessionStorer, verifier *oi }, nil } +type Identity struct { + UserID string `json:"userId"` + ProviderName string `json:"providerName"` + ProviderType string `json:"providerType"` +} + type UserClaims struct { - Email string `json:"email"` - Verified bool `json:"email_verified"` - Name string `json:"given_name"` - Username string `json:"cognito:username"` - Picture string `json:"picture"` - Sub string `json:"sub"` - Groups []string `json:"cognito:groups"` + Email string `json:"email"` + Verified bool `json:"email_verified"` + Name string `json:"given_name"` + Username string `json:"cognito:username"` + Picture string `json:"picture"` + Sub string `json:"sub"` + Groups []string `json:"cognito:groups"` + Identities []*Identity `json:"identities"` } func generateState() (string, error) { @@ -48,19 +55,21 @@ func generateState() (string, error) { func (h *Handlers) SignIn(w http.ResponseWriter, r *http.Request) { state, err := generateState() if err != nil { - log.Println("Failed to generate state") + log.Printf("Failed to generate state: %v", err) http.Error(w, "Something went wrong", http.StatusInternalServerError) return } session, err := h.session.Get(r) if err != nil { + log.Printf("Failed to get session: %v", err) http.Error(w, "Failed to get session", http.StatusInternalServerError) return } session.Values["state"] = state err = session.Save(r, w) if err != nil { + log.Printf("Failed to save session: %v", err) http.Error(w, "Failed to save session", http.StatusInternalServerError) return } @@ -74,6 +83,7 @@ func (h *Handlers) CallbackHandler(w http.ResponseWriter, r *http.Request) { session, err := h.session.Get(r) if err != nil { + log.Printf("Failed to verify ID Token: %v", err) http.Error(w, "Failed to get session", http.StatusInternalServerError) return } diff --git a/session.go b/session.go index 1afd695..4203c34 100644 --- a/session.go +++ b/session.go @@ -3,13 +3,14 @@ package cauth import ( "context" "encoding/gob" + "log" + "net/http" + "github.com/coreos/go-oidc/v3/oidc" "github.com/gorilla/sessions" "github.com/rbcervilla/redisstore/v9" "github.com/redis/go-redis/v9" "golang.org/x/oauth2" - "log" - "net/http" ) const SESSION_NAME = "auth-session" @@ -21,7 +22,7 @@ type RedisSession struct { type RedisSessionParams struct { RedisAddress string RedisPassword string - //SessionSecret []byte + // SessionSecret []byte } type SessionStorer interface { @@ -31,6 +32,7 @@ type SessionStorer interface { func NewRedisSessionStore(params RedisSessionParams) (SessionStorer, error) { gob.Register(&oauth2.Token{}) gob.Register(oidc.IDToken{}) + gob.Register(Identity{}) gob.Register(UserClaims{}) client := redis.NewClient(&redis.Options{ Addr: params.RedisAddress,