From 59ff04dbbc44ac0ef56e5f0346f8f46394ab0ec1 Mon Sep 17 00:00:00 2001
From: Luiz Vasconcelos <luizvasconceloss01@gmail.com>
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,